我正在尝试转换十六进制数, 就像堆栈地址
0x7ffd6fa90940
,b'\x40\x09\xa9\x6f\xfd\x7f\x00\x00'
.pwndbg> hexdump $rsp \32
+#### 0x7fffffffdc## 0 1 2 3 4 5 6 7 8 9 A B C D E F │ │
+0000 0x7fffffffdc30 e0 af 4b 00 15 00 00 00 [40 dc ff ff ff 7f 00 00] │..K.....│........│
+0010 0x7fffffffdc40 25 39 24 73 00 00 00 00 [50 dc ff ff ff 7f 00 00] │%9$s....│P.......│
我找到了三个函数,但它们没有按预期转换十六进制数:
import pwnlib.util.packing
import binascii
addr = '0000' + '0x7ffd6fa90940'[2:]
addr = binascii.unhexlify(addr)
print("[DEBUG] addr: {}".format(addr))
# Prints big endian: b'\x00\x00\x7f\xfdo\xa9\t@'
# != b'\x7f\xfd\x6f\xa9\x09\x40'
addr = 0x7ffd6fa90940
addr = pwnlib.util.packing.p64(addr, endian='little')
print("[DEBUG] addr: {}".format(addr))
# Prints lit endian: b'@\t\xa9o\xfd\x7f\x00\x00'
# != b'\x7f\xfd\x6f\xa9\x09\x40'
addr = 0x7ffd6fa90940
addr = pwnlib.util.packing.pack(addr, word_size=64, endianness='little')
print("[DEBUG] addr: {}".format(addr))
# Prints lit endian: b'@\t\xa9o\xfd\x7f\x00\x00'
# != b'\x7f\xfd\x6f\xa9\x09\x40'
# Custom implementation:
addr = '0000' + '0x7ffd6fa90940'[2:]
addr = ''.join(reversed(['\\x'+addr[i:i+2] for i in range(0, len(addr), 2)]))
print("[DEBUG] addr: {}".format(addr))
# Prints lit endian notation as a string: \x40\x09\xa9\x6f\xfd\x7f\x00\x00
# But how to convert to actual Bytes?: b'\x40\x09\xa9\x6f\xfd\x7f\x00\x00'
#
addr = addr.encode('utf-8').replace(b'\\\\',b'\\')
print("[DEBUG] addr: {}".format(addr))
# Results in: b'\\x40\\x09\\xa9\\x6f\\xfd\\x7f\\x00\\x00'
这是为什么?如何才能按预期转换?
预先感谢您提供任何提示、链接和答案!
b'\x40\x09\xa9\x6f\xfd\x7f\x00\x00'
和
b'@\t\xa9o\xfd\x7f\x00\x00'
是等价的。
\x40
和 @
是一样的。\x6f
和 o
是一样的。\x09
和 \t
是一样的。您的第二个和第三个解决方案可以满足您的需求。