pwntools使用

4373 ワード

pwntoolsツールはpwn問題を作るために必要なEXP作成ツールで、ここではクエリーに備えて簡単な使い方を書きます(写します).
1.インストール
インストールは私が書いた別の文章を参考にすることができますが、いくつかのコマンドだけです.リンク
2.モジュール紹介from pwn import *を使用して、すべてのモジュールを現在のnamespaceにインポートします.この文は、os、sysなどの一般的なシステムライブラリをインポートするのに役立ちます.
一般的なモジュールは次のとおりです.
  • asm:アセンブリと逆アセンブリ、x 86/x 64/arm/mips/powerpcなどの基本的なすべての主流プラットフォーム
  • をサポート
  • dynelf:リモートシンボル漏洩のためにleakメソッド
  • を提供する必要がある
  • elf:elfファイルを操作する
  • gdb:gdbに合わせてデバッグ
  • memleak:メモリ漏洩用
  • shellcraft:shellcodeのジェネレータ
  • tubes:tubes.sock,tubes.process,tubes.ssh,tubes.serialtubeを含み、それぞれ異なるシーンに適したPIPE
  • utils:CRC計算、cyclic patternなどの
  • のような実用的な小さな機能
    3.接続
       :sh = porcess("./level0")
      :sh = remote("127.0.0.1",10001)
        :sh.close()  
    

    4.IOモジュール
    sh.send(data)      
    sh.sendline(data)        ,         
    sh.recv(numb = 2048, timeout = dufault) ,numb ,timeout sh.recvline(keepends=True) ,keepends
    sh.recvuntil("Hello,World
    ",drop=fasle) sh.recvall() EOF sh.recvrepeat(timeout = default) EOF timeout sh.interactive() , shell , shell

    5.アセンブリと逆アセンブリ
    アセンブリ:
    >>> asm('nop')
    '\x90'
    >>> asm('nop', arch='arm')
    '\x00\xf0 \xe3'
    

    contextを使用してcpuタイプとオペレーティングシステムを指定できます.
    >>> context.arch      = 'i386'
    >>> context.os        = 'linux'
    >>> context.endian    = 'little'
    >>> context.word_size = 32
    

    disasmによる逆アセンブリ
    >>> print disasm('6a0258cd80ebf9'.decode('hex'))
       0:   6a 02                   push   0x2
       2:   58                      pop    eax
       3:   cd 80                   int    0x80
       5:   eb f9                   jmp    0x0
    

    なお、asmはbinutilsのasツール支援が必要であり、ネイティブプラットフォームとは異なる他のプラットフォームのアセンブリであれば、例えば私のx 86マシンでmipsのアセンブリを行うとasツールが見つからない場合があり、その場合は他のプラットフォームのcross-binutilsをインストールする必要があります.
    6.Shellcodeジェネレータ
    >>> print shellcraft.i386.nop().strip('
    ') nop >>> print shellcraft.i386.linux.sh() /* push '/bin///sh\x00' */ push 0x68 push 0x732f2f2f push 0x6e69622f ...

    asmと組み合わせると最終的なpyaloadが得られる.
    from pwn import *
    context(os='linux',arch='amd64')
    shellcode = asm(shellcraft.sh())
    
      
    
    from pwn import *
    shellcode = asm(shellcraft.amd64.linux.sh())
    

    shを直接実行することに加えて、重み付き、逆接続などの他の一般的な操作を行うこともできる.
    7.ELFファイル操作
    >>> e = ELF('/bin/cat')
    >>> print hex(e.address)  #         
    0x400000
    >>> print hex(e.symbols['write']) #     
    0x401680
    >>> print hex(e.got['write']) # GOT    
    0x60b070
    >>> print hex(e.plt['write']) # PLT   
    0x401680
    >>> print hex(e.search('/bin/sh').next())#    /bin/sh   
    

    8.整数packとデータunpack
    pack:p32,p64 unpack:u32,u64
    from pwn import *
    elf = ELF('./level0')
    sys_addr = elf.symbols['system']
    payload = 'a' * (0x80 + 0x8) + p64(sys_addr)
    ...
    

    9.ROPチェーンジェネレータ
    elf = ELF('ropasaurusrex')
    rop = ROP(elf)
    rop.read(0, elf.bss(0x80))
    rop.dump()
    # ['0x0000:        0x80482fc (read)',
    #  '0x0004:       0xdeadbeef',
    #  '0x0008:              0x0',
    #  '0x000c:        0x80496a8']
    str(rop)
    # '\xfc\x82\x04\x08\xef\xbe\xad\xde\x00\x00\x00\x00\xa8\x96\x04\x08'
    

    ROP(elf)を使用してropのオブジェクトを生成します.この場合、ropチェーンは空であり、関数を追加する必要があります.
    ROPオブジェクトはgetattrの機能を実現しているため、func callの形式で直接関数を追加することができ、rop.read(0,elf.bss(0 x 80))は実際にrop.call('rad',(0,elf.bss(0 x 80))に相当する.関数呼び出しを複数回追加し、最後にstrを使用してrop chain dump全体を出せばよい.
  • call(resolvable,arguments=():呼び出しを追加します.resolvableはシンボルでもint型アドレスでも構いません.後のパラメータはメタグループでなければなりません.そうしないと、1つのパラメータだけでもメタグループの形式(後にカンマを付ける)
  • と書き間違えます.
  • chain():現在のバイトシーケンス、すなわちpayload
  • を返します.
  • dump():現在のrop chain
  • を直感的に示す.
  • raw():rop chainに整数または文字列
  • を追加
  • search(move=0,regs=None,order=’size’):gadget
  • を特定の条件で検索する
  • unresolve(value):アドレスが与えられ、シンボル
  • が逆解析される.
    LINK:
    Exploit利器——Pwntools pwntools公式サイト