【发布时间】:2013-10-01 00:57:50
【问题描述】:
所以我正在为一个安全类分配任务,任务是使用堆栈溢出来调用程序从未使用过的函数 oopsDidISmashTheStack。
#include <stdio.h>
#include <stdlib.h>
int oopsDidISmashTheStack(void)
{
printf("Yup, smashing the stack is fun!\n");
exit(0);
}
int getUserInput (void)
{
char buf[12];
gets(buf);
return(1);
}
int main(void)
{
getUserInput ();
printf("Overflow failed, normal return\n");
return(1);
}
我理解在 buf 变量是 sfp 之后的概念,然后我无法弄清楚的返回地址是将返回值更改为函数所在的地址 0x080484fc 的输入。我认为填充缓冲区需要 12 个字符,然后我的印象是 sfp 并返回 4 个字节,所以我尝试用另外 4 个随机字符填充 sfp,然后使用 \xfc\x84\x04\x08 来制作返回地址指向函数。
如果有人熟悉堆栈内存的工作原理并能解释我哪里出错了,那就太好了?
【问题讨论】:
-
你能添加你为
getUserInput得到的反汇编吗? -
函数_Z12getUserInputv的汇编代码转储:0x080484b4 <_z12getuserinputv>:push %ebp 0x080484b5 <_z12getuserinputv>: mov %esp,%ebp 0x080484b7 <_z12getuserinputv>: sub $0x8 %esp 0x080484ba <_z12getuserinputv>: lea 0xfffffff4(%ebp),%eax 0x080484bd <_z12getuserinputv>: mov %eax,(%esp) 0x080484c0 <_z12getuserinputv>: 调用 0x804823908048UserInputv4c5<_zxinputv> +17>: mov $0x1,%eax 0x080484ca <_z12getuserinputv>: leave 0x080484cb <_z12getuserinputv>: ret End of assembler dump.
-
嗯,看起来不错。您是否使用
gdb或类似的调试器逐步检查了发生的情况是否符合您的预期? -
我已经尝试过了,并查看了信息框,我认为是的,但我对它的输出也不是很熟悉,所以我可能完全错了。
标签: c++ buffer-overflow stack-smash