0

我正在尝试一些简单的缓冲区溢出,并且我可以控制我的 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)

打印时,这也显示了我们这样的字符:; </p>

4

1 回答 1

0

struct.pack("<L", <some_numeric_value>) 以小端格式返回数值。0x41414141 的小端格式为 \x41\x41\x41\x41。但是当它在控制台或终端中打印出来时,每个十六进制值都会转换为它对应的 ASCII 字符。也就是说,\x41 被转换为 'A' 等等。所以

打印 struct.pack("<L",0x41414141)

打印“AAAA”。

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

打印 struct.pack("<L", 0x804843b)

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

于 2017-06-13T08:09:40.077 回答