Python 字节编码函数无法按预期工作

问题描述 投票:0回答:1

我正在尝试转换十六进制数, 就像堆栈地址

0x7ffd6fa90940

转换为相应的字节表示
b'\x40\x09\xa9\x6f\xfd\x7f\x00\x00'
.
就像它在 gdb 中的表示方式一样:

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'

这是为什么?如何才能按预期转换?
预先感谢您提供任何提示、链接和答案!

python byte endianness pwntools binascii
1个回答
0
投票
b'\x40\x09\xa9\x6f\xfd\x7f\x00\x00'

b'@\t\xa9o\xfd\x7f\x00\x00'

是等价的。

  • \x40
    @
    是一样的。
  • \x6f
    o
    是一样的。
  • \x09
    \t
    是一样的。

您的第二个和第三个解决方案可以满足您的需求。

© www.soinside.com 2019 - 2024. All rights reserved.