CTF Advent Calendar 2015 - Adventar 16日目
CTFをやると副産物として一枚岩のスクリプトができたりします。いくつか便利ツールを公開しているので、ここで紹介します。 個人的には地味に便利と思っているのですが、万人受けするようなものではなさそうです。オレ得ツールですね。
exploit.py, exploit.pl
pwn問題を解くとき、まずはじめにテンプレートとして手元にコピーしてきます。 pwntoolsとか便利なライブラリがあったりしますが、どの環境でも動かせるといろいろとよいことがあるので、recvuntilやinteractのような関数を実装したものを用意しています。
d
socatのラッパーです。デフォルトでstraceで起動します。
d ./vuln-binary
gadgets
rp++のラッパーです。rp++単体だと目grepで主要gadgetを探したりして面倒だったりします。
% gadgets ./braincpy
... (snip)
int_80 = 0x805b5c0
leaveret = 0x80481d1
pop_eax = 0x80beb89
pop_eax_ebx_esi_edi = 0x809a67a
pop_ebp = 0x80483a8
pop_ebp_ebx_esi_edi = 0x80728dd
pop_ebp_esi_edi = 0x809aa75
pop_ebx = 0x80516cb
pop_ebx_ebp = 0x80483a7
pop_ebx_ebp_esi_edi = 0x809aa74
pop_ebx_edx = 0x805adeb
pop_ebx_esi_ebp = 0x804a56a
pop_ebx_esi_edi = 0x80515a7
pop_ebx_esi_edi_ebp = 0x80489db
pop_ecx = 0x80dbc2c
pop_ecx_ebx = 0x805ae16
pop_edi = 0x80515a9
pop_edi_ebp = 0x80489dd
pop_edi_ebx = 0x8076412
pop_edi_esi = 0x8073018
pop_edi_esi_ebx = 0x8055f9b
pop_edx = 0x805adec
pop_edx_ecx_ebx = 0x805ae15
pop_esi = 0x8073019
pop_esi_ebp = 0x804a561
pop_esi_ebx = 0x8051980
pop_esi_ebx_edx = 0x805adea
pop_esi_edi = 0x80515a8
pop_esi_edi_ebp = 0x80489dc
pop_esp = 0x80beb39
pop_esp_ebx_esi_edi_ebp = 0x804cf3c
...
libc-offsets
libcのバイナリから指定された関数のアドレスのオフセットを取得します。"/bin/sh"のような文字列も取得することができます。
% libc-offsets /lib/x86_64-linux-gnu/libc-2.19.so
offset = {
'__libc_start_main': 0x21dd0,
'system': 0x46640,
'/bin/sh': 0x17ccdb, # str
}
mysqlc
mysqlコマンドのラッパーです。ユーザやテーブルのセットアップが簡単にできます。問題と同じ環境を手元に作るときによく使います。
tobin, tohex
渡されたバイト列を変換します。
% cat ~/tool/sc/x86/binsh | tohex
\x31\xc9\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc0\xb0\x0b\xcd\x80
rotn
rot1-rot26まで出力します。過去のCTFで1度だけ役立ちましたが、もうROT13ネタの問題なんてやることはないはず。
disas-seccomp-filter
libseccompにscmp_bpf_disasmというコマンドが付属していますが、そのコマンドの出力のsyscall番号にコメントを付けてくれます。CTFの過去問にはseccomp-bpfが利用されている問題は数えるほどしかないのですが、まあ便利です。
% disas-seccomp-filter ./bpf
line OP JT JF K
=================================
0000: 0x20 0x00 0x00 0x00000004 ld seccomp_data.arch
0001: 0x15 0x00 0x02 0xc000003e jeq x86_64 true:0002 false:0004
0002: 0x20 0x00 0x00 0x00000000 ld seccomp_data.nr
0003: 0x35 0x00 0x00 0x40000000 jge 1073741824 true:0004 false:0004
0004: 0x06 0x00 0x00 0x00000000 ret KILL
0005: 0x15 0x07 0x00 0x00000038 jeq SYS_clone true:0013 false:0006
0006: 0x15 0x06 0x00 0x00000039 jeq SYS_fork true:0013 false:0007
0007: 0x15 0x05 0x00 0x0000003a jeq SYS_vfork true:0013 false:0008
0008: 0x15 0x04 0x00 0x0000003e jeq SYS_kill true:0013 false:0009
0009: 0x15 0x03 0x00 0x0000009d jeq SYS_prctl true:0013 false:0010
0010: 0x15 0x02 0x00 0x000000c8 jeq SYS_tkill true:0013 false:0011
0011: 0x15 0x01 0x00 0x000000ea jeq SYS_tgkill true:0013 false:0012
0012: 0x06 0x00 0x00 0x7fff0000 ret ALLOW
0013: 0x06 0x00 0x00 0x00000000 ret KILL
dirdiff.pl
ディレクトリ同士を比較します。
例題: CSAW 2014 for300 (https://github.com/ctfs/write-ups-2014/tree/master/csaw-ctf-2014/fluffy-no-more)
wordpressのファイルが大量に渡されるのでディレクトリ同士を比較することで改竄されたスクリプトが見つかります。
% perl dirdiff.pl 'var/www/html/**/*' 'wordpress-4.0/**/*'
disastobin
objdump -dの出力結果を食わせるとバイナリを出力します。
hopper-scripts/
12/18の記事で解説します。
まとめ
普段CTFをする上でよく使う自作ツールを紹介しました。(大半が書き捨てのようなスクリプトですが) 明日は「オレオレgdb拡張スクリプト pedal」です。お楽しみに。