You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Bytes密钥转换为Shellcode格式?代码问题排查

问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:17:05