【问题标题】:Smashing Stack on Ubuntu 11.10Ubuntu 11.10 上的 Smashing Stack
【发布时间】:2012-04-19 19:12:42
【问题描述】:

当您尝试覆盖$esp 指针时,是否有人遇到过以下问题?

当然,尝试合法的缓冲区大小总是有效的!但是,当您尝试增加缓冲区大小以覆盖$esp 并且您成功地触摸$esp 的第一个字节、第二个字节或第三个字节时,它可以完美运行。但是,一旦您尝试覆盖 $esp 的全部 4 个字节,它就会完全改变它的内容以及地址。它不再显示41s,因为我使用“A”来填充缓冲区。我附上了一个屏幕截图,也许它会更详细地解释。谢谢大家。

#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
    char buffer[500];
    strcpy(buffer, argv[1]);
    return 0;
}

【问题讨论】:

    标签: ubuntu x86 segmentation-fault stack


    【解决方案1】:

    这与在 32 位非 PAE Ubuntu 内核中实现 NX emulation 以及引发 CPU 异常时有关。对于 NX 仿真线以下的内存区域(即“在”仿真 NX 区域“内”:从地址 0 到程序文本段的结尾——小于 /proc/$pid/maps 中此二进制文件的 0x08049000 结束地址),段错误是在 EIP 到达实际无效地址后交付。对于线上的地址,故障通过报告故障的不同路径触发,而不将 EIP 向前移动到故障地址,而是停留在导致故障的“ret”指令上。

    你可以在 gdb 中看到这个:

    (gdb) x/1i $pc
    => 0x8048454 <main+64>: ret    
    (gdb) info reg esp
    esp            0xbffff54c       0xbffff54c
    (gdb) x/wx $esp
    0xbffff54c:     0x41414141
    

    您还可以在dmesg 输出中看到错误报告方式的不同。这是与“508”尝试相关的输出:

    [  585.913896] a.out[1528] general protection ip:8048454 sp:bff1e8ec error:0 in a.out[8048000+1000]
    

    这是针对“507”的:

    [  598.999760] a.out[1531]: segfault at 414141 ip 00414141 sp bfcac2c0 error 4 in libc-2.13.so[5e7000+178000]
    

    如果您在安装了 PAE 内核 sudo apt-get install linux-image-$(uname -r)-pae 的情况下启动,并且您有一个支持 PAE 的 CPU,您将看到您所期望的行为(因为 NX 仿真将被禁用以支持硬件 NX),并且所有4 次尝试将与预期的 EIP 发生段错误。

    【讨论】:

      猜你喜欢
      • 2011-12-08
      • 1970-01-01
      • 2011-12-15
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      相关资源
      最近更新 更多