読者です 読者をやめる 読者になる 読者になる

Shi0shishi0

とても眠い。

TrendMicroCTF2016 Analysis - defensive 200 >>> Writeup

CTF セキュリティ

少し前に開催されたTrendMicroCTF2016のバイナリ問題解いてなかったので解いてみました。
問題は以下のような感じ。

Category: Analysis - defensive
Points: 200
Unpack me!

Download the file
Decrypt the downloaded file by the following command.

指示通り復号してzipを解くと、32bitのexeファイルが出てきます。
ファイル名が unpackme_unpackme_unpackme_unpackme.exe となっているので、言葉の通りアンパックを行う問題かと推測できます。

事前調査

$ file unpackme_unpackme_unpackme_unpackme.exe
unpackme_unpackme_unpackme_unpackme.exe: PE32 executable (console) Intel 80386, for MS Windows

VirtualBox上に構築したWindows7 32bit環境で普通に実行すると、変なメッセージを残してexeファイルは削除されます。

f:id:echoha610:20160930225930p:plain

普通に動作させるだけでは得られる情報が少なそうなので、デバッガで動かしてみます。

コードの開始位置付近を見ると、パック処理が施されていそうな感じのコードが見えます。
このままの状態でデバッグしていくのは辛いので、JMP命令のところまで進めてジャンプし、その先で一旦ストップします。

f:id:echoha610:20160930231510p:plain

この位置をOEPと想定して、OllyDbgのプラグインであるOllyDumpを実行します。
取り出したexeファイルをデバッガで開くと、さっきと違って関数の情報や内部の文字列情報が確認できます。

この後はexeファイルをImmunityDebuggerで開き、ひたすらデバッグしていきました。
このexeファイルには多くの解析避けが実装されていました。どんな解析避けがあったか、せっかくなので一部抜粋して紹介します。

アンチデバッグ入りexeファイルの解析

最初は「CreateToolhelp32Snapshot関数」を使用して、環境内で動作しているプロセスの一覧を取得しています。
Process32First関数とProcess32Next関数を使ってプロセス名を順々に読み出して、ハードコードされた文字列(解析ツール名)と比較しています。

これはそれなりにメジャーな解析ツール避けだと思います。
確か、JPCERT/CCさんの公開している資料にある、「Asruex」というマルウェアとかがこの方法で解析ツール等の検知を行なっていた気がします。

(参考)ショートカットファイルから感染するマルウエアAsruex(2016-06-23)
https://www.jpcert.or.jp/magazine/acreport-asruex.html


f:id:echoha610:20160930024150p:plain

続きを見ていくと、自身がデバッガ上で動作しているかをチェックする、「IsDebuggerPresent関数」を使用しています。
とても有名な関数と解析避けですが、有名すぎるせいかこれを使って解析避けしようとしているマルウェアを逆に見ないという、、、
この解析避けは関数実行後のEAXレジスタの値を0に書き換えてあげるなどすると回避できます。

f:id:echoha610:20160930024246p:plain

レジストリの情報を見る仮想環境検知では、RegOpenKey関数を使って HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\VirtualBox Guest Additions の有無を確認しています。

f:id:echoha610:20160930024236p:plain

HKEY_LOCAL_MACHINE\HARDWARE\Description\System をチェックし、VirtualBoxという文字列を含んでいるかチェックしたりもしていました。

f:id:echoha610:20160930024453p:plain

こっちはVBOXという文字列を含んでいるかチェックしています。

f:id:echoha610:20160930024634p:plain

他には、以下のレジストリ情報を取得し、"VMWARE"、"VBOX"、"QEMU"を含んでいるかどうか見ています。

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0

f:id:echoha610:20160930232404p:plain

この辺はあまり細かく見ていないのが、おそらくは「GetUserName関数」でユーザ名がハードコートされた文字列と一致していないかをチェックしています。

f:id:echoha610:20160930024816p:plain

IN命令の戻り値に 0x564D5868(ASCII文字で"VMXh")が含まれていないかをチェックするVMware環境検知。
これもメジャーな仮想環境検知手法で、実装されているマルウェアを今でもたまに見かけます。

f:id:echoha610:20160930024904p:plain

NtGlobalFlagsにアクセスして値を取得し、0x70かどうかをチェックする仮想環境検知とか。

f:id:echoha610:20160930025058p:plain

なんとなく目についたものを羅列して見ましたが、随分とたくさんの解析避け/仮想環境検知がexeファイル内部に組み込まれていました。
基本的には戻り値を書き換えて比較系命令を誤魔化すか、比較に使うハードコードされた文字列を書き換えることで回避できました。

どんどん進めていくと、%TEMP%の下に「unpackme_unpackme.tmp」というファイルを生成する箇所があります。
そこから更に進めていくとtmpファイルがされるので、今度はそっちを調査していきます。

f:id:echoha610:20160930025504p:plain

ドロップされたファイルの解析

バイナリエディタでドロップされたファイルを開いてみると、exeファイルのマジックナンバーであるMZ(4D 5A)が見えます。

f:id:echoha610:20160930025652p:plain

拡張子をexeに変更したらアイコンが7-zipのものになりました。
なのでとりあえず7-zipで解凍して見るかなぁ、と思って解凍すると更に別のexeファイルが、、、

下の画像はWin10のホストで撮ったものなので少しWin7と様子が違うのですが気にしないでください。

f:id:echoha610:20160930025913p:plain

f:id:echoha610:20160930030217p:plain

このexeファイルをデバッグしていくと、途中に変な文字列を引数にCALL命令を実行している箇所があります。
このあたりのCALL命令は実行すると標準出力に文字列を出すようなので、逐一出力される文字を確認しながら進めて行きます。

ジャンプを行う箇所がいくつも挟まっていたので、そこをNOPで潰しながら進めていくとFLAGが出ました。

TMCTF{h3ll04n4lyz1n6w0rld}

久しぶりにCTFの過去問触ってみましたが、パックされたexeファイルの解析という意味でちょっと練習になりました。Analysis - defensive 300、400もそのうちやりたいです。
Twitterでしばしば叩かれているのを見るTrendMicroCTFですが、こういうウイルスベンダらしい問題を出してくるところは面白いなと個人的には感じています。

参考にさせていただいたサイト

securitykitten.github.io

pinksawtooth.hatenablog.com