当您尝试覆盖$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; }
这与在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进行分段.