当您尝试覆盖$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;
}
答案 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进行分段。