如何将Bytes密钥转换为Shellcode格式?代码问题排查
我定义了一个Bytes类型的密钥:
KEY = b'\xb5\x89\xd5\x03\x03\x96`\x9dq\xa7\x81\xed\xb2gYR'
希望将其转换为Shellcode格式,即每个字节以\x加两位十六进制字符的形式呈现(如\x41\x42\x43...)。我尝试了以下代码:
KEY = b'\xb5\x89\xd5\x03\x03\x96`\x9dq\xa7\x81\xed\xb2gYR' hexkey = KEY.hex() l = [] for i in range(0, len(hexkey) - 2, 2): b = '\\x' + hexkey[i] + hexkey[i+1] l.append(b)
但输出中的反斜杠未正确转义,得到结果:
['\xb5', '\x89', '\xd5', '\x03', '\x03', '\x96', '\x60', '\x9d', '\x71', '\xa7', '\x81', '\xed', '\xb2', '\x67', '\x59']
请问我哪里出错了?有没有更优的实现方法?
错误原因
你的代码其实没写错,显示\\x只是Python打印列表时的表示方式问题。Python在输出列表元素时,会展示字符串的“转义后形式”(用来明确区分字符串中的特殊字符),但实际上每个字符串元素里的反斜杠是单个的\。比如单独打印l[0],会输出\xb5,而不是\\xb5。如果把列表里的所有元素拼接成一个字符串,就能得到正确的Shellcode格式:
print(''.join(l)) # 输出:\xb5\x89\xd5\x03\x03\x96\x60\x9d\x71\xa7\x81\xed\xb2\x67\x59
更优的实现方法
有几种更简洁高效的方式可以直接生成目标Shellcode字符串:
方法1:遍历字节直接格式化
直接遍历Bytes对象的每个字节,用格式化字符串生成\x开头的十六进制片段,最后拼接:
KEY = b'\xb5\x89\xd5\x03\x03\x96`\x9dq\xa7\x81\xed\xb2gYR' shellcode = ''.join(f'\\x{b:02x}' for b in KEY) print(shellcode) # 输出:\xb5\x89\xd5\x03\x03\x96\x60\x9d\x71\xa7\x81\xed\xb2\x67\x59
这里b:02x表示把字节转换成两位十六进制字符串,不足两位时用0补全。
方法2:利用hex()和字符串分割拼接
先把Bytes转成连续的十六进制字符串,再按每两位分割,最后用\x连接所有片段:
KEY = b'\xb5\x89\xd5\x03\x03\x96`\x9dq\xa7\x81\xed\xb2gYR' hex_str = KEY.hex() shellcode = '\\x' + '\\x'.join(hex_str[i:i+2] for i in range(0, len(hex_str), 2)) print(shellcode) # 输出同上
这种方法不需要循环遍历每个字节,处理大Bytes对象时效率更高。
方法3:使用binascii模块(可选)
如果习惯用模块工具,也可以用binascii.hexlify实现类似效果:
import binascii KEY = b'\xb5\x89\xd5\x03\x03\x96`\x9dq\xa7\x81\xed\xb2gYR' hex_str = binascii.hexlify(KEY).decode('utf-8') shellcode = '\\x' + '\\x'.join(hex_str[i:i+2] for i in range(0, len(hex_str), 2)) print(shellcode)
内容的提问来源于stack exchange,提问作者IRP_HANDLER

