对EIP的有限控制

2024-05-16 01:55:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

但是一旦我输入real一个地址,比如:0x804843b,我的EIP就会变成一个无效的地址,比如0x000000

基本上,我在这里输入的每个地址(而不是不能解析为字母字符的0x42424242)都会得到一个无效的EIP地址:

作品:

^{pr2}$

同样,以上所有这些都将导致字母字符打印时,如 AAAA公司 EEEE公司 ABCD

不起作用:

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

打印时,还显示以下字符: ;)


Tags: 脚本地址stdoutsys字母公司字符real
1条回答
网友
1楼 · 发布于 2024-05-16 01:55:16

在结构包(“<;L”,<;some\u numeric_value>;)返回little-endian格式的数值。0x41414141的Little-endian格式为\x41\x41\x41\x41。但当它在控制台或终端中打印出来时,每个十六进制值都被转换成相应的ASCII字符。也就是说,\x41被转换为“A”,依此类推。所以

print struct.pack("<L",0x41414141)

打印“AAAA”。在

0x804843b的little-Endian格式是\x3b\x84\x04\x08。0x3b是“;”的ASCII值。0x84、0x04和0x08是不可打印的字符。 因此

print struct.pack("<L", 0x804843b)

prints out;)“where”代表不可打印的字符。在

相关问题 更多 >