C/C++函数调用,栈溢出
int main()
{
extern void TestOverFlow(int *p);
int num[2] = {0,0};
TestOverFlow(num);
return 0;
}
void TestOverFlow(int* p)
{
int i = 3;
do
{
*(p+i) = i;
}
while(i--);
}
// 汇编代码是本人根据自己理解写的,如果有问题,请高手指出问题所在,谢谢。
/*
push %ebp
movl %esp,%ebp
xor %eax,%eax
push %eax
xor %edx,%edx
push %edx
subl $4,%esp
call .L
addl $4,%esp
ret
.L push %ebp
movl %esp,%ebp
movl $3,%ecx
leal 16(%ebp),%ebx
movl %ebx,8(%ebp)
movl $4,%esi
.L1 movl %ecx,0(%ebp,%esi)
subl $1,%ecx
addl $4,%esi
jne .L1
movl $0,16(%ebp)
leave
ret
*/
/* 疑问:当主函数ret时,主函数栈返回地址的数据已被更改为0x00000003,那么会发生两种情况:1、禁止访问;2、无效指令;
3、从当前指令开始执行。但这段代码生成了可执行文件,但运行时会报错:
程序“[5744] TestOverFlow.exe: 本机”已退出,返回值为 -1073740791 (0xc0000409)。
想了一个下午,还是没搞清楚。
*/
[解决办法]
栈溢出,不是这么弄的,你这是在搞main的返回地址,不是在搞那个TestOverFlow
另外,大家溢出都习惯用aabbccdd,这样有意义的东西填充内存,找地址方便多了,呵呵呵
建议你去网上找个例子,跟着例子做一下,有问题再来问吧
[解决办法]
你是想把TestOverFlow的返回地址破坏掉,还是想把main函数的返回地址破坏掉。如果是前者。TestOverFlow无法返回。程序指针不能回到调用TestOverFlow的下一行“return 0;”
你是否想用纯汇编改写新版的 void f(int *p)?
[解决办法]