CSAW CTF 2014

年一の日記が、年二に!

誘われて CTF に出てみました。詳細:
http://d.hatena.ne.jp/shinichiro_h/20140922
で、大体かいてあるので、まぁ、自分が見たとこだけ備忘録的に。

pybabbies (Exploitation 200)

とりあえず __builtins__ をほぼつぶした python interpreter で、任意コードが実行できれば ok.
調べてみると、__class__ からたどって os module の instance にアクセスできるらしい。
2-3 時間調べてた気がする。

解けたので、予約を取ってあったマッサージへ。一時離脱。

bo (Exploitation 100)

@mayahjp さんが、他の問題を strings で解いたって言ってて、しかも flag じゃなくて FLAG_ 探してた、とか
言ってたのを聞いて、そういえば、と思い strings かけなおす。終了。

eggshells (Reverse Engineering 100)

同 @mayahjp さんが fork bomb とか言ってる。fork とかなかったよなぁ、grep するも、やっぱりない。
んで、util.pyc なるのが浮いてることに気づく(最初から気づけ)。
中読むと file ダウンロードかよ。。。 同時に @mayahjp さんも解ける。

csaw2013reversing2.exe (Reverse Engineering 200)

windbg 動かせばいーんじゃね?ということだったんだが、なんか上手く動かない。
ので、チームチャットにそのことだけ貼って放置。なんで動かなかったんだろう。。。

aerosol can (Reverse Engineering 500)

引数にフラグを渡すと正解か教えてくれるプログラムが与えられて、フラグを探す。
途中まで @shinh さん解いてて、まー、そこまでいけばあとやるだけだろ、と引き取る。
最初適当にいじくるも上手くいかないので、あきらめて objdump の結果をちゃんと読む。

最初は strlen で長さチェック + flag{ の prefix チェック。ここは楽勝。
適当に弄ってると、どうも謎の関数っぽいのが、flag の各文字を atoi してるっぽいところくらいまではわかる。
あとはひたすら gdb かけて、watch と b で、どこで分岐してるかチェックして、分岐の条件から asm を逆にたどって、分岐しづらそうなほうに全部持ってけるように引数を調整を繰り返す。最後 0 除算とかで crash してたけど、適当に引数調整してたら、なぜか消えた。
You Win
と、出たので submit ... するも accept されない。なんか、そもそも与えられたプログラムがちゃんと動いてないらしい。
IRC で judge に聞いてもらって、OKをもらう。
と、さっくり書くと10行だけど、地道にやってたら丸一日かかった。。。

weissman (Reverse Engineering 300)

残り眺めて、他の人がやってそうなのは、多分手を出してもあまり役にたたなさげだったので、
他の人がみてないやつ、ってことで選ぶ。

すでに aerosol で、だいぶ脳みそがオーバーヒート気味だったので、
そんなに考えなくてもよさそうなの、と思ったんだけど、全然そんなことなかった。

圧縮された binary が渡されて、読めばOK。
とりあえず、HINTが出てて、ファイルのヘッダフォーマットだけ公開されてた。
それくらいは最初に od 書けて読めとるわ、とか思ったけど、"compress"って書いてて、
あー、ファイル壊れてるんじゃなくて、圧縮ファイルなのか、と気づく。
とりあえず、圧縮されたまま archive を展開。
od で眺めてると 0x13 + 平文が繰り返してる。たまにずれてて、ずれてるところは 3 bytes のデータ。
ここがおそらく圧縮部。ヒント用のテキストファイルが混ざってるので、とりあえず手で解凍していく。
最初のファイルの2/3 くらい終わったところで、これ web のどっかにオリジナル転がってるんじゃ、と唐突に思いつきぐぐる
見つかる。
つき合わせて、圧縮コードと解凍データのペアのリストを作る。最初の 1byte が長さ、のこり 2byte がなんかデータっぽい。
ふと、なんとなく平文の先頭と照らし合わせてみるとほぼ unique なので、なんかこの 2byte でブロックの位置を表してるらしい、とあたりをつける。
が、2ファイル目のデータよくみると、稀に conflict 。なんか、適当な hash で探索してるっぽいので、hash つくれば勝ちか。
と、思うも、結構つらい。単純な xor とかでもなさげな雰囲気。ここまでですでに 8 時間くらい粘ってた気がする。

ふと、風呂浴びつつ、そういえばこの問題100チームくらい解いてたよなぁ。っつーかこの hash そんなに簡単につくれるわけないよなぁ、と思い至り。壊れた jpg を無理やり作る方向に方針転換。
圧縮部分そんなになかったので、とりあえず指定バイト数分 0 で埋めて、あとで check sum あわせりゃなんとかなるべ、と思いやってみると、とりあえず開くだけは一瞬でできる。1-255 も試したけど、そっちはだめだったので、意図的にそうなってたのかな。
まー、壊れてる jpg なら、paint と gimp で開いて、両方をむーっと眺めると、それっぽい文字がなんとなく見えた気がする。
ので、submit -> fail。よく見ると、解答コピペ時に ',' とか消えてる... orz。もう一回 -> fail。typo ... だめだ。
submit -> accept。

cfbsum (Cryptography 300)

みてはいたのだけど、結局解けないままであった。適当に xor とかかけてたけど、やっぱり読めない。
というところで、時間切れ。

まとめ

なんか、最初のほうのとか、この手のコンテストでは常識なんだろうなぁ、というのに散々ハマった。
明らかに勉強不足。
順位は、メンバー(7人くらい?)ほぼ初参加なことを考えると、まずまずだったと思うけど、せっかくだから TOP 10 入りたかったなぁ。
他の問題はあまり見てなくて、とりあえず、@mayah さんがエスパー力発揮しまくってたのと、@shinh さんと @tzik_tack さんが binarian 力で無双ってたのが印象的だった。
あと、体調不良がいただけなかった。まだしんどい。

ICPC とはちょっと傾向が違うけど、ICFPc とかでよく自分とチーム組んでくれてるような面々は楽しめるんじゃないかなぁと思った。
あと、明らかに勉強不足(大事なことなので(ry