【问题标题】:getting unexpected result when using Python's struct.pack method使用 Python 的 struct.pack 方法时得到意外结果
【发布时间】:2015-11-02 17:08:00
【问题描述】:

当我使用 python 的 struct.pack 方法时,我得到了一个奇怪的结果。 代码如下所示:

>>> struct.pack('<i', 0x01d1f23a)

我想要得到的结果是将十六进制地址转换为小端(“

#!/usr/bin/perl
my $eip = pack('V',0x01ccf23a); 
print "$eip[0]";
print "$eip[1]";
print "$eip[2]";
print "$eip[3]";

结果是:582422041

我需要用 python 达到同样的结果。

【问题讨论】:

  • 那么你期望的结果是什么,而你得到了什么?
  • 你能解释一下为什么冒号有问题吗?你用输出字符串做什么?您想要一个长度为 4 的字符串,其中包含四个字符 chr(0x3a)chr(0xf2)chr(0xd1)chr(0x01),还是想要一个长度为 16 的字符串,在打印时看起来像 \x3a\xf2\xd1\x01? (如果是后者,为什么?)还是别的什么?
  • 嘿,马克我刚刚编辑了我的问题。我希望结果是这样的:582422041
  • @Igalname:好吧,这对我来说毫无意义(你为什么要把所有的数字都这样计算?),但如果这真的是你想要的,那么 ''.join(str(x) for x in struct.pack('&lt;i', 0x01ccf23a))(在 Python 3 中) ) 或 ''.join(str(ord(x)) for x in struct.pack('&lt;i', 0x01ccf23a)) (在 Python 2 中) 可以解决问题。
  • @Igalname:你试过打印吗?如果你这样做了,你会注意到它仍然以':' 开头(实际上它与struct.pack('&lt;i', 0x01D1F23A) 相同)。

标签: python shellcode endianness


【解决方案1】:

一切似乎都很好:

>>> struct.pack('<i', 0x01d1f23a)
b':\xf2\xd1\x01'

最高有效字节01 存储在最高内存地址,因此提供小端序。我唯一可能注意到的是b'\x3a' 看起来像:,因为它是一个有效的 ASCII 符号。

如果答案不能解决您的问题,请更新您的帖子并提供详细信息。

编辑

为了将数字表示为十六进制形式的字节序列,而不转换为 ASCII,请使用以下行:

>>> ' '.join(hex(b) for b in struct.pack('<i', 0x01d1f23a))
'0x3a 0xf2 0xd1 0x1'

使用str 而不是hex 来获得十进制表示。

>>> ' '.join(str(b) for b in struct.pack('<i', 0x01d1f23a))
'58 242 209 1'

【讨论】:

  • “:”是问题所在,我需要将十六进制值保留为十六进制值并转换为 ASCII。类似于 perl pack('V', ) 方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2012-02-22
  • 2022-11-01
  • 2021-05-08
  • 2017-10-04
  • 1970-01-01
相关资源
最近更新 更多