Threat Level

  • Internet Security Systems - AlertCon(TM)

Digital Forensic Search

facebook

2012年5月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
無料ブログはココログ

« 知の難きに非ず,知に処するは則ち難し. | トップページ | 仕事は楽しいかね? »

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する.

S2_peid

OllyDbgでspooIsv.exeを読み込むと,以下のようなエラーが出る.

S2_ollydbg_badformat

Bad or unknown format of 32-bit executable file 'C:\works\malwares\spooIsv.exe'

ファイルをlinuxマシンからwindowsマシンに移したときにファイルが破損したせいかもしれないので,icatで抽出したときのハッシュ値と照合する.HelixのファイルブラウザでMD5のハッシュ値を計算可能.

S2_helixmd5

ハッシュ値は一致している.つまり,最初からフォーマットがおかしいファイルのようだ.

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という実行ファイル名でコ ピーする.

途中,以下のようなダイアログが出るが,とりあえずスルー.

S2_petools_warning

下画面で[Optional Header]を選択.

S2_peedit

NumberOfRvaAndSizesは一番最後の値.読み込んだ時点では0x0000000A(10)となっており,これを0x00000010(16)に修正する.その後OK->OKで,編集した値が保存される.

S2_pe_optional

修正後のspooIsv_PEedited.exeをOllyDbgで読み込むと,別のエラーが出る.

S2_ollydbg_error

アプリケーションを正しく初期化できませんでした (0xc0000135)。[OK]をクリックしてアプリケーションを終了してください。

調べてみたところ,該当バイナリが.NET Frameworkのライブラリを使っている場合に,システム側にそれがインストールされていないと出るメッセージらしい.

よって,.NET Frameworkをインストールする.ところで,ハニーポットのWindows Server 2003では.NETがデフォルトでインストールされているので,このバイナリが実行された可能性は高いといえる.

.NET Frameworkインストール後,以下のようにエラーメッセージなしにOllyDbgで読み込むことが出来,ようやくアンパックの準備ができた・・よう に見えたが,停止しているアドレスがおかしい.エントリポイントは一般的に400000台のはず.ステータスバーに以下のメッセージ.

S2_ollydbg_violation

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版 Advanced Windows 改訂第4版

著者:ジェフリー リッチャー
販売元:アスキー
Amazon.co.jpで詳細を確認する

このことから,未処理例外の仕組みを利用した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でメモリ表示.

S2_olly_altm

OwnerがspooIsvの行をダブルクリック.

S2_olly_ep

ImageBase=400000, AddressOfEntryPoint=21200から,エントリポイントは421200であることが分かる.CPU表示でCtrl+Gでアドレス入力→ジャンプしてブレークポイントをセット.
その後trace over(Ctrl+F12)でEPまで実行.

S2_olly_epbreak

ここから本格的に動的解析を行っていく.とりあえず今回はここまで.

-----------------------------------------------------------------

3/4 追記

前述のブレーク時点では,何らかの理由で関数のラベルや文字列などの情報が表示されない.PEiDでは判別できなかったが,やっぱりpackされて いるんじゃないかと思いセクション名の「.yzpack2」を手がかりに調べてみると,YZPack2.0というpackerが存在しているようだ.これ をunpackできるツールとして,VMUnpackerというのがあるらしい.

ダウンロードして実行すると,以下の画面.

S2_vmunpacker_run

unpackするspooIsv.exeを選択すると,やはりyzpack v2.0というpackerらしい.

S2_vmunpacker_open

[Unpack]ボタンを押すと,unpackに成功したメッセージが表示される.

S2_vmunpacker_unpack

unpackしたバイナリspooIsv_unpacked.exeから抽出した文字列はこれ.「spooIsv_unpacked.exe.txt」をダウンロード

文字列的にボットであることは明らか.

次にspooIsv_unpacked.exeをOllyDbgで読み込む.読み込む前にアンチデバッグ対策としてプラグイン「Olly Advanced」をインストールする.このプラグインは様々なOllyDbgのbugfixやanti-debug機能をOllyDbgに追加する.

S2_olly_advanced_2

プラグインをチューニングして,spooIsv_unpacked.exeをOllyDbgで読み込んだ画面は以下の通り.前回示した画面に比べる と,API関数名や引数が表示され,大幅に情報量が増えている(前回はそもそもpackされた状態だったが).これなら苦労せずに済みそうだ.

S2_unpack_and_ollyadvanced
今回はツールに助けられたが,もっとanti-debugやanti-disassemblyを勉強しないと.
暇があればWinDbgなどのカーネルデバッガも使ってみたい.

« 知の難きに非ず,知に処するは則ち難し. | トップページ | 仕事は楽しいかね? »

Digital Forensics」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/401548/10390065

この記事へのトラックバック一覧です: CCI: Windows Season2 未知のバイナリの解析(spooIsv.exe その1):

» メモリについて知りたい [メモリについて知りたい]
メモリ(MEMORY)はRAM−ランダム・アクセス・メモリといってじゃ、CPUの処理中にすぐに使いそうなデータや、頻繁に繰り返して使うようなデータなどを一時的に保存する機能を持っているのじゃ。 [続きを読む]

« 知の難きに非ず,知に処するは則ち難し. | トップページ | 仕事は楽しいかね? »