首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C/C++函数调用,栈溢出,该怎么解决

2012-05-22 
C/C++函数调用,栈溢出int main(){extern void TestOverFlow(int *p)int num[2] {0,0}TestOverFlow(num

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)?

[解决办法]

探讨
引用:

引用:
引用:
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F……

热点排行