pwntools使用
4373 ワード
pwntoolsツールはpwn問題を作るために必要なEXP作成ツールで、ここではクエリーに備えて簡単な使い方を書きます(写します).
1.インストール
インストールは私が書いた別の文章を参考にすることができますが、いくつかのコマンドだけです.リンク
2.モジュール紹介
一般的なモジュールは次のとおりです. 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.接続
4.IOモジュール
5.アセンブリと逆アセンブリ
アセンブリ:
contextを使用してcpuタイプとオペレーティングシステムを指定できます.
disasmによる逆アセンブリ
なお、asmはbinutilsのasツール支援が必要であり、ネイティブプラットフォームとは異なる他のプラットフォームのアセンブリであれば、例えば私のx 86マシンでmipsのアセンブリを行うとasツールが見つからない場合があり、その場合は他のプラットフォームのcross-binutilsをインストールする必要があります.
6.Shellcodeジェネレータ
asmと組み合わせると最終的なpyaloadが得られる.
shを直接実行することに加えて、重み付き、逆接続などの他の一般的な操作を行うこともできる.
7.ELFファイル操作
8.整数packとデータunpack
pack:p32,p64 unpack:u32,u64
9.ROPチェーンジェネレータ
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公式サイト
1.インストール
インストールは私が書いた別の文章を参考にすることができますが、いくつかのコマンドだけです.リンク
2.モジュール紹介
from pwn import *
を使用して、すべてのモジュールを現在のnamespaceにインポートします.この文は、os、sysなどの一般的なシステムライブラリをインポートするのに役立ちます.一般的なモジュールは次のとおりです.
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全体を出せばよい.
LINK:
Exploit利器——Pwntools pwntools公式サイト