使用Python的struct.pack方法时得到意想不到的结果

时间:2015-11-02 17:08:00

标签: python shellcode endianness

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

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

我想要获得的结果是将十六进制地址转换为小端(“&lt;”)。 编辑: 相当于Perl(对不起打印,不知道perl)

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

结果是:582422041

我需要用python实现相同的结果。

1 个答案:

答案 0 :(得分: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'