CCI: Windows Season2 未知のバイナリの解析(spooIsv.exe その1)
Season1同様,不揮発性データの解析で検出した5つのマルウェアのうち,タイムラインの早い順に静的解析・動的解析を行っていく.
spooIsv.exe (検出日時:Dec 19 2007 03:22:57)
まず,md5sumでハッシュ値を取得する.
[haru@fedora8 win2nd]$ md5sum spooIsv.exe
0fcde95916fcc23ecbed1b47632cd74c spooIsv.exe
fileコマンドでフォーマットを判別する.
[haru@fedora8 win2nd]$ file spooIsv.exe
spooIsv.exe: MS-DOS executable PE for MS Windows (GUI) Intel 80386 32-bit Mono/.Net assembly
Windowsの一般的な実行ファイル形式であるPEフォーマット.
次にstringsコマンドでファイルに含まれる文字列を抽出.「spooIsv.exe.str」をダウンロード
[haru@fedora8 win2nd]$ strings -a -tx spooIsv.exe > spooIsv.exe.str
どうやらpackされている模様.「.yzpack2」という文字列から,yzpackというpacker?
PEiDで読み込むと,「Nothing found」なので,手動でunpackする.
OllyDbgでspooIsv.exeを読み込むと,以下のようなエラーが出る.
Bad or unknown format of 32-bit executable file 'C:\works\malwares\spooIsv.exe'
ファイルをlinuxマシンからwindowsマシンに移したときにファイルが破損したせいかもしれないので,icatで抽出したときのハッシュ値と照合する.HelixのファイルブラウザでMD5のハッシュ値を計算可能.
ハッシュ値は一致している.つまり,最初からフォーマットがおかしいファイルのようだ.
honeynet.orgのドキュメントに よると,PEヘッダの中のOptionalHeader構造体のメンバであるNumberOfRvaAndSizesの値が不正なときに,上記のようなエ ラーが出るらしい.この値はその直後のメンバであるDataDirectory(インポートテーブルなどの相対アドレスを格納している)の数を定義してい るが,実際は使われていない.OllyDbgは律儀にその値をチェックして,異常であればエラー報告する.
よって,spooIsv.exeのPEヘッダのNumberOfRvaAndSizesを適切な値に編集する.大抵はその値は16に固定されているそうなので,16に修正する.PEToolsの編集機能を利用する.
PE Tools起動後に[Tools]->[PE Editor]を選択すると,実行ファイルを選択する画面になるので,spooIsv.exeのコピーを選択する.編集は選択した実行ファイルに直接行わ れるため,spooIsv.exeのコピーを作っておき,それを読み込む.ここではspooIsv_PEedited.exeという実行ファイル名でコ ピーする.
途中,以下のようなダイアログが出るが,とりあえずスルー.
下画面で[Optional Header]を選択.
NumberOfRvaAndSizesは一番最後の値.読み込んだ時点では0x0000000A(10)となっており,これを0x00000010(16)に修正する.その後OK->OKで,編集した値が保存される.
修正後のspooIsv_PEedited.exeをOllyDbgで読み込むと,別のエラーが出る.
アプリケーションを正しく初期化できませんでした (0xc0000135)。[OK]をクリックしてアプリケーションを終了してください。
調べてみたところ,該当バイナリが.NET Frameworkのライブラリを使っている場合に,システム側にそれがインストールされていないと出るメッセージらしい.
よって,.NET Frameworkをインストールする.ところで,ハニーポットのWindows Server 2003では.NETがデフォルトでインストールされているので,このバイナリが実行された可能性は高いといえる.
.NET Frameworkインストール後,以下のようにエラーメッセージなしにOllyDbgで読み込むことが出来,ようやくアンパックの準備ができた・・よう に見えたが,停止しているアドレスがおかしい.エントリポイントは一般的に400000台のはず.ステータスバーに以下のメッセージ.
Access violation when reading [72A26950] - use Shift+F7/F8/F9 to pass exception to program
とりあえずShift+F9をすると,今度は「アプリケーションを正しく初期化できませんでした (0xc0000005)。[OK]をクリックしてアプリケーションを終了してください。」のポップアップが.
そもそも普通に実行できてないのではないか?と思い,TSKでハニーポットのw2k3の.NETのバージョンを調べてみると,1.1だった.
[haru@fedora8 win2nd]$ fls -o 63 2k3disk.dd 5245
d/d 5247-144-1: 1041
r/r 5381-128-3: NETFXSBS10.exe
r/r 5382-128-3: NETFXSBS10.hkf
r/r 5397-128-3: sbscmp10.dll
d/d 5299-144-6: v1.0.3705
d/d 5246-144-7: v1.1.4322 ← バージョンを表すフォルダ名
解析用XPに入れたのは3.0だったので,互換性がないことによるエラーと思い,1.1にリプレースしてみたが,結果は変わらず.
The Art of Unpackingに よると,SEH(構造化例外処理)を使ったデバッグ検出というのがあるらしい(5.1節).その対策として,[Debugging options]->[exceptions]で例外を無視するように設定してみたが,同様のmemory access violationが発生.
ところで,0xc0000005の例外は2度デバッガに通知される.「Advanced Windows」によると,これはプログラム内の全てのSEHのフィルタが,該当する例外に対して処理せずに EXCEPTION_CONTINUE_SEARCHを返して,システム側にその例外が投げられたことを意味する.デバッガはファーストチャンス通知で例 外が発生したことを知らされ(1回目),その後ラストチャンス通知でそれをアプリケーションが処理できないバグであることを知らされる(2回目).
![]() |
Advanced Windows 改訂第4版
著者:ジェフリー リッチャー |
このことから,未処理例外の仕組みを利用したunhandled exception filterによるanti-debugという仮説を立てる.unhandled exception filterによるデバッガ検出を避けるため,OllyDbgのプラグインであるHide Debuggerを使用するが,またも解決せず.
-------------------------------------------------------
その後しばらくして,デバッガを使わずに実行させたところ,同様のエラーが発生するので,デバッガ対策以前にspooIsv_PEedited.exeそのものが,実行不可能なファイルになっていたことが分かった.
一
方で,オリジナルのspooIsv.exeは実行できる(実行直後に何らかの操作を行い自身を削除する怪しげな挙動).また,先ほどのOllyDbgでの
「Bad or unknown format of 32-bit executable
file」エラーは,無視してそのまま実行を継続できるようなので,ヘッダの修正はしないまま解析を進める.つまり何もする必要はなかったorz
OllyDbgでspooIsv.exeを読み込む.以前のstringsコマンドの出力文字列からpackされているように感じたが,後から見る と「bot/GET/NICK」など視認できる文字列があったことに気づく.OllyDbgからpackされているときに出る警告もないので,packさ れていないようだ.また無駄な推測をしてしまった.
spooIsv.exe読み込み直後は「Bad or unknown format of 32-bit executable file」でntdll内で止まるので,まずエントリポイントでbreakするように設定する.
Alt+Mでメモリ表示.
OwnerがspooIsvの行をダブルクリック.
ImageBase=400000, AddressOfEntryPoint=21200から,エントリポイントは421200であることが分かる.CPU表示でCtrl+Gでアドレス入力→ジャンプしてブレークポイントをセット.
その後trace over(Ctrl+F12)でEPまで実行.
ここから本格的に動的解析を行っていく.とりあえず今回はここまで.
-----------------------------------------------------------------
3/4 追記
前述のブレーク時点では,何らかの理由で関数のラベルや文字列などの情報が表示されない.PEiDでは判別できなかったが,やっぱりpackされて いるんじゃないかと思いセクション名の「.yzpack2」を手がかりに調べてみると,YZPack2.0というpackerが存在しているようだ.これ をunpackできるツールとして,VMUnpackerというのがあるらしい.
ダウンロードして実行すると,以下の画面.
unpackするspooIsv.exeを選択すると,やはりyzpack v2.0というpackerらしい.
[Unpack]ボタンを押すと,unpackに成功したメッセージが表示される.
unpackしたバイナリspooIsv_unpacked.exeから抽出した文字列はこれ.「spooIsv_unpacked.exe.txt」をダウンロード
文字列的にボットであることは明らか.
次にspooIsv_unpacked.exeをOllyDbgで読み込む.読み込む前にアンチデバッグ対策としてプラグイン「Olly Advanced」をインストールする.このプラグインは様々なOllyDbgのbugfixやanti-debug機能をOllyDbgに追加する.
プラグインをチューニングして,spooIsv_unpacked.exeをOllyDbgで読み込んだ画面は以下の通り.前回示した画面に比べる と,API関数名や引数が表示され,大幅に情報量が増えている(前回はそもそもpackされた状態だったが).これなら苦労せずに済みそうだ.
今回はツールに助けられたが,もっとanti-debugやanti-disassemblyを勉強しないと.
暇があればWinDbgなどのカーネルデバッガも使ってみたい.
« 知の難きに非ず,知に処するは則ち難し. | トップページ | 仕事は楽しいかね? »
「Digital Forensics」カテゴリの記事
- Bug Fixed: NTFS SI/FN Timeline EnScript(2012.05.11)
- Update: Memory Forensic EnScript(2011.05.06)
- Memoryze: Missing Connections (Settled)(2011.03.05)
- Making Filename Attribute Timeline(2010.11.18)
- Reserved Address Space in Windows Physical Memory(2011.05.11)
トラックバック
この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/401548/10390065
この記事へのトラックバック一覧です: CCI: Windows Season2 未知のバイナリの解析(spooIsv.exe その1):
» メモリについて知りたい [メモリについて知りたい]
メモリ(MEMORY)はRAM−ランダム・アクセス・メモリといってじゃ、CPUの処理中にすぐに使いそうなデータや、頻繁に繰り返して使うようなデータなどを一時的に保存する機能を持っているのじゃ。
[続きを読む]

















コメント