SECCON 2016 Online CTF にチーム「yharima」で参加していました。なかなか難しい問題が多く、まだまだ勉強せねば、という感じがしました。145位、500点でした。
VoIP
pcap ファイルが渡されるので Wireshark で開き、 VoIP 機能で開くと音が再生できてフラグをしゃべっていた。少し聞き取りづらかったが、がんばって聞き取って提出。
Memory Analysis
メモリダンプがおかれており、 volatility というツールがヒントに書かれている。
偽の svchost がアクセスしているウェブサイトを調べてほしい、そのサイトに行けばフラグが手に入る、というもの。また、ヒントには「hosts」とも書いてあった。
volatility の使い方を軽く確認したあと、ウェブサイトを見ていると書いてあるのでまずは通信内容を確認した。
$ volatility_2.5_linux_x86 -f ./forensic_100.dat --profile=WinXPSP2x86 connections Volatility Foundation Volatility Framework 2.5 Offset(V) Local Address Remote Address Pid ---------- ------------------------- ------------------------- --- 0x8213bbe8 192.168.88.131:1034 153.127.200.178:80 1080
IP アドレスはわかったが、繋ぎに行っても nginx の初期インストール画面のようなものが表示されたので、「hosts」というヒントを元に C:\Windows\System32\drivers\etc\hosts を探すことに。filescan や dumpfiles を試みたがなかなか手に入らないので、最終的にはstrings して「153.127.200.178」で grep した。
$ strings forensic_100.dat | grep 153.127.200.178 153.127.200.178 crattack.tistory.com attack.tistory.com 153.127.200.178 crattack.tistory.com 153.127.200.178:80
ホスト名は候補が二つに絞られたが、 /etc/hosts を手元に書いてこのホスト名・IPアドレスの組み合わせにつないでもまだフラグはない。いろいろ見ているうちに、 HTTP をしゃべっている内容のようなものが見えていたので、このやり取りもまだメモリに残っているのでは、ということで “GET /” を探した。
$ strings forensic_100.dat | grep 'GET /' GET /image/237C0C3E576BA0AD06F720 HTTP/1.1 GET /entry/Data-Science-import-pandas-as-pd HTTP/1.1 GET /entry/Data-Science-import-pandas-as-pd HTTP/1.1 GET /entry/Data-Science-import-pandas-as-pd HTTP/1.1 GET /entry/Data-Science-import-pandas-as-pd HTTP/1.1
ようやく URL がわかったので、 アクセスするとフラグ。
$ curl http://attack.tistory.com/entry/Data-Science-import-pandas-as-pd SECCON{_h3110_w3_h4ve_fun_w4rg4m3_}
Anti-Debugging
バイナリファイルが渡され、調べてみると Windows の exe ファイルだったので Windows 上で起動。起動するとパスワードを聞かれ、パスワードが違うと言われた。
Windows のバイナリデバッグはしたことがなかったので、全体的に yuta1024 に手伝ってもらって(というよりほぼ教えてもらって)実施。まずは OllyDbg をインストールした。
OllyDbg には上の画像のような文字列検索機能があり、それぞれ参照元の命令がある場所も検出できた。パスワードが違う的なエラーの周辺で、色々している判定っぽい処理があったので、そこで一旦止めると “I have a pen.” という文字列がメモリ上にあった。これがパスワードではないかと推測して入力すると表示が変わり、今度はデバッグ環境であることが検出された。デバッグではない環境で実行するとパスワードが正しいと言われたが何も表示されなかった。
エラーメッセージには OllyDbg や VMware などいろいろなものが書かれており、その少し前のコードを見るとだいたい直前に「CMP DWORD PTR SS:[***],*」「JNZ SHORT bin.********」の二つを実施しており、おそらくは正規の実行では通らないようになっていたので、 OllyDbg の機能で JNZ を JMP に(命令の一バイト目を 0x75 から 0xEB に)書き換えた。
すると、今度はゼロ除算で落ちるようになった。その部分の IDIV 命令(上の画像の 0x4015DE)だけ NOP で塗りつぶすと、何もしないで正常終了するようになった。文字列一覧では暗号化されたフラグと思わしき意味ありげな文字列があったので、その参照元を見るとその IDIV と同じ関数の少し下にあった。
そのため、落ちる IDIV から、フラグと思わしき文字列の参照元の直前までを NOP で塗りつぶして実行すると、フラグが出力された。
(追記)同じチームのメンバーの writeup です。