Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;必须是不带空字节的字符串";或;can';t concat str to bytes“;在命令行上传递有效负载_Python_Python 3.x_Exploit_Shellcode - Fatal编程技术网

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字符串中。你要用的地址不是这样的,所以。。。好吧,你来了