了解Linux中的堆栈

我有一个小型(且易受攻击的)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用户-VirtualBox 2.6.38-8-通用#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
我怎么了?

解决方法:

这不仅是局部变量的大小-通常来说,平台ABI,阻塞寄存器,alloca()区域指定的大小都有填充…-例如检查this nice picture

上一篇:Objdump -S没有显示Linux内核模块的源代码列表


下一篇:linux-使用gdb和nasm缺少调试信息