如何在python中将二进制文件转换为字符串

时间:2017-08-20 12:34:00

标签: python python-2.7 casting penetration-testing

对于infosec项目,我使用字符串作为一种字节数组。这通常在漏洞测试中完成。在构建字节数组时,我想连接可打印的字符和不可打印的字符。

这不是转换问题,我真的想要转换类型。我可以围绕chr()编写函数或方法,但必须有更好的方法。

>>> print "A"*10 + chr(0x20) + "B"*10
AAAAAAAAAA BBBBBBBBBB

例如,如果我要插入一个大的二进制数组怎么办?

>>> print "A"*10 + 0xBEEF + "B"*10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

>>> print "A"*10 + 0xBEEFBEEFBEEFBEEFBEEFBEEF + "B"*10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'long' objects

我可能在这里使用了错误的数据类型,因为我很确定我甚至不能保证字符串有8位字节。

我希望的一个例子:

>>> print "A"*10 + 0xBEEFBEEFBEEFBEEFBEEFBEEF + "B"*10
AAAAAAAAAA������������BBBBBBBBBB

2 个答案:

答案 0 :(得分:1)

如果在字符串中键入转义的十六进制数字有点麻烦,可以使用binascii.unhexlify,例如:

from binascii import unhexlify

b = 'A'*10 + unhexlify('BEEF' * 6) + 'B'*10
# 'AAAAAAAAAA\xbe\xef\xbe\xef\xbe\xef\xbe\xef\xbe\xef\xbe\xefBBBBBBBBBB'

在Python 3中,您必须确保以字节字符串开头(或者您将收到TypeError: Can't convert 'bytes' object to str implicitly):

b'A'*10 + unhexlify('BEEF' * 6) + b'B'*10
# b'AAAAAAAAAA\xbe\xef\xbe\xef\xbe\xef\xbe\xef\xbe\xef\xbe\xefBBBBBBBBBB'

答案 1 :(得分:1)

另一种可能性是使用struct模块,这可以让您获得更多控制权 在输出上。这是一个Python 2.7示例:

import struct

s = struct.pack("6H", *[0xbeef]*6)

s是以下字符串:

'\xef\xbe\xef\xbe\xef\xbe\xef\xbe\xef\xbe\xef\xbe'

您可以打包长整数,有符号或无符号或双浮点数等。 例如,这里填充为double的相同十六进制值:

>>> struct.pack("6d", *[0xbeef]*6)
'\x00\x00\x00\x00\xe0\xdd\xe7@\x00\x00\x00\x00\xe0\xdd\xe7@\x00\x00\x00\x00\xe0\xdd\xe7@\x00\x00\x00\x00\xe0\xdd\xe7@\x00\x00\x00\x00\xe0\xdd\xe7@\x00\x00\x00\x00\xe0\xdd\xe7@'

还有可能指定结束。当然,要做相反的操作(解包)。