SECCON 2016大阪大会に参加してきた(完全版)
新幹線の中が暇ならwriteupを書けばいいということに最後の40分くらいで気づいたので書くこととする。
チームSSR_CTF_BU(yosupotと僕)で参加してきた。
結果は14チーム中7位(多分)。
SECCON大阪の最終結果です。 #seccon pic.twitter.com/bmCCNnxsWU
— ツモり四限遅刻 (@ymduu) 2016年10月2日
雑な感想
バイナリ早食い大会、ということで、普通の自明pwnが大量に出てきて、それをangr とかを駆使して捌いていくゲームだと思っていたのだが、実際は大分違って困惑した。
セキュキャンでangrを使った講義(6D、リバースエンジニアリングを自動化せよ)を受けていたので、なんとなくその人を思い出していたら、前にその人が居て面白かった。
SECCONは問題に露骨に出題者のキャラクターが出て面白いですね。(坂井さんの多アーキ問題とか)
前日まで
普通の自明pwnが大量に出てきて、それをangr とかを駆使して捌いていくゲームだと思っていたので、BOFからROPでシェルを取るコードとかFSBで任意アドレスに任意値を書き込むペイロードを作るコードとかx86/x64でありがちなシェルコード(open-read-writeとか、シェル開くとかdup2した後にシェルを開くとか)を自動生成できるコードとかを書いてライブラリ化しておいた。(ほとんど役に立たなかった)
また、angrを用意しておくと良い、とのことなのでangrのドキュメントと格闘して、サンプルコードの英語コメントを和訳したりしていた。(これは別記事で上げます)
コンテスト本番
なんかサーバーが4つ与えられて、大まかに分けると
・ある入力を与えるとファイルの中身を読み込んで標準出力に流してくれるバイナリ
・BOFの脆弱性があり、あるファイルの中身を出力することができるバイナリ
が降ってくるので、バイナリを解析してそれぞれ要求するペイロードを作ってね、という問題だった。
なぜ問題の種類が2題なのにサーバーが4つあるかというと、それぞれの問題は5分/1秒ごとに問題バイナリが変わるから(は?)。
1秒の方は難読化がかかっていて、読むのも大変という感じだった。
やったこと
一回も実践で使ったことのないangrをいきなり本番で使えるわけ、なしw
ということで、僕は
・ある入力を与えるとファイルの中身を読み込んで標準出力に流してくれるバイナリ
のeasy(5分に一回バイナリが変化、難読化はなし)
の自動化を行った。
方針としては、標準ライブラリを使っていないので、syscallで読み込んだあとは一文字ずつ正解文字と比較していることを考える。
バイナリを読むと、rcxに文字列の長さが入っていて(実はこの時はバイナリを読んでいなくて、rcxとかecxのcはcounterだし、ループ変数を入れるならそこでしょ、とエスパーしてしまった)、それをデクリメントしながら入力文字列と鍵らしきものをxorしながら比較していくバイナリである(c@Np2Ol6*1やんけ)ということがわかる。
そして、そのXORされた文字列はバイナリの中(機械語の前か後ろ)にあるので、取り出すことができる。
当然XORの鍵もバイナリ内にあり、文字列のアドレスもバイナリ内にあるので、取り出すことができる。
以上より、以下のことをやればいいということがわかる。
・objdump -d -M intel binary | grep "mov ecx"
で文字列長を取得
・objdump -d -M intel binary | grep xor
でxorキーを取得
・objdump -d -M intel binary | grep movabs
で文字列のアドレスを取得(バイナリではmovabsで文字列のアドレスをレジスタに入れていた)
すれば必要な情報が揃うことがわかり、入力すべき文字列(印字可能とは限らない)がわかる。競技のルールとしてこれをbase64encodeして投げればフラグが手に入る。そのコードは以下。
そろそろ東京に着いてしまいそうなので、コードは家で上げることとする。(最悪)
家に着いたので、コードを載せる。テンプレとして大会で提示されたexercise.pyを使っている。
easyだけ自動化できていたチームは半数くらいだったが、その中でも最後の方に自動化成功したので順位は振るわなかった。(かなしい)
妨害コンテンツ
妨害コンテンツとして、運営の方が、最初の自己紹介に関して掘り下げた質問を行っていた。
ちょうどその時、上の自動化スクリプトの実装が終盤に差し掛かっていたので、質問された時に邪険に答えてしまった。
申し訳なさみが高い。(本当に申し訳ないです)
自動化実装がめっちゃ良いところで妨害コンテンツによる妨害を受けてしまい、「今自動化がめっちゃ良いところなんで話しかけないで欲しいんですけど💢💢💢」と返してしまったのは申し訳ない気持ちが大きい(実際そのちょっと後にeasyの自動化ができた)
— ツモり四限遅刻 (@ymduu) 2016年10月2日
他の人のwriteup
見たい。
ツイで叩かれているけど、ここで各位がwriteupを上げるとangr日本語資料虚無みたいな状況が改善されてangrで解けるrevにつぎ込まれる時間が消えてもうなんだかんだで世界が平和になるのでみんなwriteup書いてほしい。(僕はangrを使わないで自動化していました。)
— ツモり四限遅刻 (@ymduu) 2016年10月2日
SHOW BY ROCK!!
間に合わなかった。
スコアボード
可読性が虚無。
スコアボードの可読性が無なので終始自分が何位かわからんかった
— ツモり四限遅刻 (@ymduu) 2016年10月2日
工大祭進捗
無し。今日はSECCON出てSB69みておしまいなのでパンフは明日書き始めます。よろしくお願いします。
— ツモり四限遅刻 (@ymduu) 2016年10月2日
大阪と京都の距離感
絶妙。
人生の最適解
早く貧乳ツンデレ美少女になりたい
— ツモり四限遅刻 (@ymduu) 2016年10月2日
参加した方はお疲れ様でした。angrを使ったwriteup見たいです。よろしくお願いします。
*1:セキュリティキャンプ2016の応募課題で、似たような挙動をROPで書いたちょっと変なプログラムを解析する問題があった。 http://titech-ssr.blog.jp/archives/1058074153.html