調べたこと、作ったことをメモしています。
こちらに移行中: https://blog.shimazu.me/

CTFというものに参加してみた (SECCON2014)

友達から前日に誘われて、CTFというものに参加してみた。事前準備はゼロ。気楽にいこうぜ(´◔౪◔)۶ヨッシャ!

9:00に大学集合、のはずが、ついたのは10:00近く。うっ。
さっそく初めてみる。

友達が上からパケットを解析し始めたので、僕は下からPrint it!をやってみた。とりあえずfileコマンド打ったらバイナリらしかったので、じっくり見てみる。

・・・まったくわからん。
14バイトの'¥0'が区切りっぽかったので、これを改行に置き換えてプリントするスクリプト書いてみるも、規則性が4byteごとにあるように見える&各行が3要素&2行ずつ同じ要素がある、くらいの内容しかわからない。
とか言ってる間に授業があるので横浜まで移動。ぐぬぬ。ここまででもう11:00。解けねぇ・・・

お昼すぎから、授業をうけながら問題をといてみる。
箱庭、おもしろそうと思うもexeなのでwin環境のないぼくはできない。
しかたないのであみだくじやるか、ということでfileコマンド。
実行ファイルっぽいのでやってみたら、あみだくじを解けばいいっぽい。
rubyで適当に書いてみたら解ける・・・一瞬じゃん・・・

そんなことはなかった。 並び順が変わる。ちゃんと読まないとだめかw
ということで最初の1 2 3 4 5 6 7 8とかいうのを読み取るように変更。 No.11-20はうまくいく....が21でコケる。
上下逆かーい!ということで直す。手間だ...

直して実行したところ、21-30まで成功....したと思ったらこんどはインデックスがずれてる?? なんかよくわからんけど各行の0byte目が表示されない文字でうまってるっぽい。cur = line.index('-', cur+1)とかやってたのを'|'の位置から算出するように変更。

そしたら今度は幅が変わる・・・・
めんどくせぇーとか思いながら実装を変更。
これを解いたらできるのか?それともこれはダミーで実はバイナリハックしないと答えがわからないのでは?という気持ちが心をよぎる。
思わずnmする。

  $ nm amida
nm: amida: シンボルがありません

ンンンッ
どうやら対策が・・・???

  $ objdump -dS amida > amida.dump

ざーっと眺めると、SIMD命令でシャッフルとかしてるしなんじゃこりゃ〜 やっぱしちゃんと解くかー、とか思ってやる。

・・・こんどは・・・横向きのあみだ・・だと・・・・・
ここでやる気を失ってアセンブラを読み始めたら、授業が終わって16:00。
一問も解けてないぞw という感じ。つらみ。

帰宅して18:00。あと3時間じゃー
レジスタとスタックの動きを追ったらわりとすぐに解けてよっしゃ!

int x = 0;
for (i=0; i <= 0xFF; i++) x += i;
x -= 2;
printf("FLAG{%d}¥n", x);

でした。(多分)

次にSQLインジェクションを手伝う。 となんでも許してくれたので、

' union select * from sqlite_master --

とかやると、secconテーブルがあるらしいということが判明。

' union select * from seccon --

だとエラー。ちょっとなんでか悩む。とカラム数たりないんじゃ、と気づいたので

' union select *,ROWID,ROWID,ROWID,ROWID from seccon --

とやってflagをゲット。

そしたら友達からgifを結合したQRコードが送られてきた。
アプリによっては白黒反転したQR読めないっぽい?
僕のやつで読めたので登録。

次にXSSをやる。
はじめ"><script type="text/javascript">alert('XSS');</script>とかやったら、スペースが+に変換されるのでtypeなしで実行。
ステージ2でscriptとalertとXSSがダメ、とか言われる。なんじゃそりゃ〜

ブックマークレットやってみたけど、javascriptって書いたらjavaになる。やっぱだめか、ということで悩む。
そもそもscriptって書いちゃだめだよな、onloadとかonclickならいけるんじゃん?あとは文字列分解すれば騙せるよな、ということで、以下のようなコードをかく。

"><input   type="button"   onclick="document.write('<scrip'+'t>aler'+'t(¥'X'+'SS¥');</scrip'+'t>')" value="xxx"/>

いける。神。
ここまではよかった。

ステージ3。scrip, t, aler, X, SS, script, input, buttonとかがだめ。もはや打つ手なし。死。
これは書いた内容に応じて封じてくるんだな、でもステージのメーター進み具合見た感じ、20くらいあるぞ、思いつかねぇぞ、と思ってくっそ悩む。

はっ、これはforで無限に回せばいいのでは・・・・・・・
と思いついて、最初に戻る。

"><script>for(i=0;i<10000;i++){alert('XSS');}</script>

OKを押し続けたら答えをゲット。ありがとうございました。

次にソーシャルハッキングを見てみる。
わっけわからんのでとりあえずソースを見る。

function(p,a,c,k,e,r){

とかいうのがあったのでpackerでぐぐったらあった。

ソースを復元して見てみると、cgiにGETメソッドでリクエストを叩いてるっていうことがわかる。がしかしそれだけじゃ何もわからない。
本当にソーシャルハッキングをやるのを友達にまかせ、僕は違う問題をやる。

ということで、捏造された契約書をやる。
mountするので一苦労。
fdiskしてlosetupしてmount。

つぎにTIFFEXIFでも見ればわかるんじゃね、ということで
Exif情報表示
というサイトを見つけたのでやってみる。けどこれってファイルを最後に触った時間なのでは・・・

調べていると、どうやら他のものもあるのか?というので良くわからない。
docxってzipだったよなたしか、ということでunzipとかしても中の更新日時は1980年とかになってるしよくわからない。
違うEXIFの読めるツール使ってみるかーと思ったのは20:55。

  $ sudo aptitude install exiftool

からのexiftoolをやってみると、

File Inode Change Date/Time     : 2012:05:23 14:12:40+09:00

こ、これでは・・・???? 大急ぎでブラウザを開く。タブ開きすぎてわからない。慌てる。

いっけーーーーー

21:00:20

ちーん。

ということで、チームは900点。暫定74位。
パケット解析、decode me、x86アセンブラ、重ねてみよう、SQLiとXSSを解けました。

授業いったりして朝と夜しかまともにできなかったけど、わりと楽しかった。
勉強にもなったので、次回はちゃんと参加してみたいなぁ。