繁体   English   中英

了解linux中的堆栈

[英]Understanding stack in 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。

Plattform: 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我出错了什么?

这不仅仅是局部变量的大小 - 一般来说,填充到平台ABI指定的大小,破坏寄存器, alloca()区域...... - 检查这个好看的图片

缓冲区地址很难获得。 我也有这个问题。 有一篇很好的文章教你如何粉碎堆栈。 但是在我的电脑,ubuntu 12.04,gcc 4.6或4.4.7中,我测试了最新的eggshell.c,结果是核心转储。 他把shellcode放在环境变量中。但它必须找到环境变量地址。我也发现粉碎堆栈有时候没有效果。任何人都可以帮助它运行?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM