在Ubuntu 11.10上粉碎堆栈

时间:2012-04-06 03:44:09

标签: ubuntu x86 segmentation-fault stack

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

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

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

smash attempt

1 个答案:

答案 0 :(得分:5)

这与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进行分段。