概要
2016/12/10 15:00~の24時間、SECCON 2016 online CTF(オンライン予選)が開催されました。私はチームEanbai(先輩、同級生、私の三人)として初参加を果たし、チーム得点は500点、順位は1834チーム中159位で終えました。
ちなみに12月10日はやんばるツーデーマーチというウォーキングイベントも開催されていて、例年通り私は40kmコースに友人たちと4:00~15:30まで参加してからのSECCONログインだったので身体も頭もくたくたになりましたが、どちらも楽しかったです。
では早速、解けた問題のWriteupをば。
Anti-Debugging(Binary - 100)
|
|
シンプルな問題文にbinというファイルが添えられていました。fileコマンドで何のファイルなのか確認すると
|
|
とのことだったので、ひとまず拡張子をexeに変えて実行します。すると、「Input password >」と表示されて入力待ち状態になります。適当に「hogehoge」とか打つと「password is wrong.」と怒られてしまうので、ひとまず次の手順に従ってパスワードを入手しました。
- 「Input password >」をセットしている部分のアドレスを確認
- ollydbgで1で調べたアドレスにブレークポイントをセット
- ステップ実行していき、入力値を検査している箇所に来たらレジスタの値を確認
1はIDAで確認しました。この時ついでにIDAが吐いてくれるアセンブリのグラフビューを眺めてbinがどのようなプログラムになっているのか、大きなプログラムでもなかったので大まかに把握しました。2、3までやったところで、パスワードが「I have a pen.」であることがわかりました。流行を抑えていくスタイルなんですね。正しいパスワードがわかったのでもう一度プログラムを(デバッガ無しで)普通に起動して打ち込んでやると今度は「Your password is correct.」と言われてプログラムは終了します。やったぜ!…ところでフラグは?デバッガでどうなっているのかもう一度見ていきます。
そして、ここから問題名にもある通りAnti-debugとの戦いになります。ollydbgで掴んだ状態でもう一度I have a pen.を唱えると今度は「But detected debugger!」とも言われるようになりました。該当部分のコードを確認すると、どうやらIsDebuggerPresent関数を使って自分自身がデバッガに掴まれていることを検知してフラグを守っている健気な姿が見られました。
これを突破するためにOlly AdvancedというAnti-Anti-debugを実装したプラグインがあったので、それを使おうと思ったのですが、IsDebuggerPresentの次のNtGlobalFlag隠しを有効にしても突破できず、その後は結局手動でバイナリを書き換えていきました。ちゃんと読まないでプログラムのバイナリを書き換えるのはあまりよろしくないですが、Anti-debugに関しては少しの命令を実行して、その結果レジスタにロードされる値などを元に検出を行っているものが大半なので、cmp命令の部分をnopで埋めればプログラムの大元の動作を破壊することなく突破できてしまいます。
例えば、先程のNtGlobalFlagもcmp命令をなかったことでJNZ命令に引っかからなくなり、スキップできます。少なくとも今回のバイナリに関しては手元で試した全ての検出手法がこのcmp2nop(勝手にそう呼んでる)でスキップできました。
ただ最後の最後、(暗号化された)フラグっぽい文字列がollydbgでも見えるようになってきたところで0と1を比較して違ったらフラグ見せない、みたいな処理があったのでそこは比較結果が一致になるように改変して突破しました。
全ての検出機構を無事突破し、フラグの復号処理を抜けたら終わりです。ちなみに出てきたフラグを見てもわかりますが、Ascii85というエンコード方式なんだそう。へー。また一つ知見を得ました。
以上、pafish.exeが頭に浮かんだ状態で終始取り組んだ問題でした。
Flag: SECCON{check_Ascii85}
Memory Analysis(Forensics - 100)
メモリダンプのファイルが渡されて、中身を解析してフラグをくれるWebサイトにアクセスしてね!という問題。ヒントが2つ与えられていて、とりあえず1つ目のヒントに従ってVolatility(公式サイトリンク)というフォレンジックツールを導入しました。CUIツールで、引数に色々とオプションを付けるとよしなにやってくれる良い奴です。下記の例では、imageinfoオプションを付けて推奨Profileを調べています(このダンプファイルはWinXPSP2x86でやっていけば良さそう。後でも使います)。
|
|
さて、2つ目のヒントにhostsを見ろと書いてあったので、とりあえずファイルのダンプの仕方を調べてやってみます。
|
|
これでカレントディレクトリにfile.None.0x819a3008.hosts.datみたいなファイルが生成されて、この中身を見ると
hostsですね。注目すべきは最後の行のcrattack.tistory.comというやつ。果たして本当にそうでしょうか?と33分探偵ばり(ネタが古い)にnslookupすると
|
|
ほらね。やっぱり何かありそうです。問題文でも偽のアクセスがどうのこうのと言ってるので、方針は良さそうです。ここからはコマンドリファレンスとにらめっこして情報を幾つか見ましたが、最終的に答えにたどり着けたのは「iehistory」というオプションでした。
|
|
このサイト自体はアクセスしても特にフラグらしいものは得られませんでしたが、iehistoryで出てきた/Data-Science-import-pandas-as-pdというやつにアクセスするとファイルが落ちてきて、それをテキストエディタとかで読むとフラグが書いてある、というオチでした。
これらの作業をするにあたって、Volatility CheatSheet_v2.4.pdfとCommand Reference(at github)を大いに活用しました。
Flag: SECCON{_h3110_w3_h4ve_funw4rg4m3}
その他取り組んだ問題1: VoIP(Forensics - 100)
pcapファイルが渡されて、中にVoIP電話の音声パケットデータが入っているので、それを聞き取る問題。これはEnglishをlistenする問題で英語パーフェクトマスター!wの私は「余裕やんけ」と言いながら聞き取った「SECCON{9001IBR}」をポストするも無残に散りました。正しいフラグは「SECCON{9001IVR}」。チームメンバーの先輩が無事得点してくれました。良かったです。
その他取り組んだ問題2: PNG over Telegraph(Crypto - 300)
愉快な動きをするSECCON TOWER(YouTubeへのリンク)の動きからアルファベットを読み出して、その結果をどうにかデコードしてPNGファイルを出力する問題。最初の趣旨説明部分で21文字(ただし.(ピリオド)含む)がわかるように説明してくれていて、それを表にまとめるとその他のわかっていない6文字もなんとなく推察できるようになっていました。ただ、とにかく動画が長くて、色々しんどい問題だ…ってなったところで解くのをやめてしまいました。面白かったので時間があったらやってみようかなという感じです。
まとめ
上に挙げた以外の問題もいくつか触ったりしましたが、pwnの問題もflag.txtという文字がスタック上に見えるのに手が届かない、そういう感じで悔しかったです。あとWeb問も解けなかったので、この辺できるようになりたいなと思いました。
そういえば
来週はセキュリティミニキャンプ in 沖縄ですね。
以上です。