我正在尝试一些简单的缓冲区溢出,并且我可以控制我的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)
打印时,这也显示我们的字符如下: ;
答案 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)
打印出来; 其中 代表不可打印的字符。