对EIP的控制有限

时间:2016-12-25 23:26:49

标签: python gdb overflow eip

我正在尝试一些简单的缓冲区溢出,并且我可以控制我的EIP,但它似乎仅限于一组严格的字符。

例如,我有一个python脚本执行以下操作

buff = "A" * 128
buff += struct.pack("<L", 0x42424242)
sys.stdout.write(buff)

这正确地将我的EIP覆盖为:0x42424242 例如,我可以将0x42424242的值更改为0x42434445,它仍然可以工作。

但是一旦我输入一个地址,如:0x804843b,我的EIP将变为无效地址,如0x000000

基本上我在这里输入的每个地址而不是0x42424242都没有解析成字母字符我得到了无效的EIP地址:

使用:

buff += struct.pack("<L", 0x42424242)
buff += struct.pack("<L", 0x45454545) 
buff += struct.pack("<L", 0x41424344)

以上所有这些都会在打印时产生字母字符 AAAA EEEE ABCD

不起作用:

buff += struct.pack("<L", 0x804843b)

打印时,这也显示我们的字符如下: ;

1 个答案:

答案 0 :(得分:0)

struct.pack(“&lt; L”,&lt; some_numeric_value&gt;)以小端格式返回数值。小端格式0x41414141是\ x41 \ x41 \ x41 \ x41。但是当它在控制台或终端中打印出来时,每个十六进制值都会转换为相应的ASCII字符。也就是说,\ x41被转换为'A',依此类推。所以

  

print struct.pack(“&lt; L”,0x41414141)

打印'AAAA'。

0x804843b的小端格式为\ x3b \ x84 \ x04 \ x08。 0x3b是';'的ASCII值。 0x84,0x04和0x08是不可打印的字符。 因此

  

print struct.pack(“&lt; L”,0x804843b)

打印出来; 其中 代表不可打印的字符。