【发布时间】:2012-11-25 22:37:10
【问题描述】:
我有一个小的(易受攻击的)C 示例:
#include <unistd.h>
int main(int argc, char *argv[])
{
char buff[100];
if(argc < 2)
{
printf("Syntax: %s <input string>\n", argv[0]);
exit (0);
}
strcpy(buff, argv[1]);
return 0;
}
我编译它:
gcc -o basic_overflow basic_overflow.c -fno-stack-protector -fno-builtin
当我用 gdb 打开这个程序时,反汇编是这样的:
Dump of assembler code for function main:
0x08048424 <+0>: push ebp
0x08048425 <+1>: mov ebp,esp
0x08048427 <+3>: and esp,0xfffffff0
0x0804842a <+6>: add esp,0xffffff80
...
在 main 中设置断点(在序言之后)。由于我们有一个本地缓冲区,我希望我的堆栈帧大小为 100 字节。但是当我执行 $ebp-$esp 时,我可以看到结果实际上是 136。
平台:Linux user-VirtualBox 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 i686 i686 i386 GNU/Linux
编译器:gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
调试器:GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
我做错了什么?
【问题讨论】:
-
你在哪个平台上?你的编译选项是什么?哪个编译器版本?在不了解上述事实的情况下,很难回答有关低级细节的问题。
-
反汇编显示什么?
-
gcc 不也将 argc 和 argv 放入堆栈吗?
-
所以我们编译没有优化,想知道为什么代码不是很好。我们不应该那样做!
-
@BoPersson,有缺陷的想法;
-O实际上可能增加帧大小,因为内联合并多个帧。
标签: c linux assembly disassembly