2

所以我不得不为分配做一个缓冲区溢出,我觉得我很接近。我必须注意,我的老师已经设置了一个 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清除但被卡住了。谢谢你的帮助!

4

0 回答 0