マルウェア対策研究人材育成ワークショップ2008

ステルスデバッガを利用したマルウェア
解析手法の提案

NTT情報流通プラットフォーム研究所◎川古谷裕平 岩村誠 伊藤光恭

2008/10/10

1

目次
 背景
 ステルスデバッガの提案
 CCC Dataset 2008検体による評価
 考察
 まとめ2008/10/10

2

背景 マルウェアの高度化、高機能化

柔軟な機能追加
自身の隠蔽化
耐解析機能（Anti Debug機能）…

 難読化ツールの利用 パッカー/プロテクタ/難読化ツール

2008/10/10

3難読化されたマルウェアの基本的な動作
展開ルーチン

命令ポインタ(EIP)OEP：Original Entry Point

難読化されたオリジナ
ルコード

メモリの確保2008/10/10

オリジナル
コードの展開OEPへのジャンプ4

マルウェアの基本的な解析手法


デバッガで実行してOEPでとめる
メモリ上の値をダンプしてファイルに保存
ダンプされたバイナリをIDA proなどで逆アセンブル
がんばって読む

OllyDbgとかOEP

00 F0 00
00 00 E9
FB 41…

C&C Server
感染手法
パスワード
etc…
2008/10/10

5

アンパッキングAnti Debug機能
展開ルーチン+Anti Debug機能

デバッガ検知ブレークポイント検知
シングルステップ検知
仮想マシン検知
時間制限
…

オリジナル
コードの展開OllyDbg終了
異常動作
2008/10/10

6従来デバッガの問題点
1. 同環境上にデバッガとデバッギが存在するため、デバッガが攻撃を受けやすい(見つかりやすい)
2. CPUやOSのデバッグ支援機構はステルス性を考慮して設計されていない いろんな箇所にデバッグの痕跡を残してしまう
In Debugging

OllyDbg
ますてし

OllyDbgッグ
バデ2008/10/10

デバ
ッグ
中7

ステルスデバッガの提案
 仮想マシンを利用してマルウェアの実行環境から隔離された環境からデバッグを行える機構の提供(ring -1)
 従来のCPUやOSのデバッグ支援機構に頼らないデバッグ機構の提供

ゲストOS
Controller
制御
仮想マシン
Based on
Qemu

仮想CPU

仮想物理メモリ

仮想ディスク

仮想H/W
結果

2008/10/10

8実際の解析環境
OllyDbg

解析＋データ抽出

ゲスト OS

IDA proController

制御
制御
仮想CPU

仮想物理メモリ

仮想ディスク

仮想H/W

仮想マシン
結果
2008/10/10

9

ステルスデバッガの特徴


仮想H/W制御によるデバッガ機能

タイムコントロール

ゲストOS内の時間をコントロールしながらデバッグを行う。デバッグ中はゲストOS内の時間は完全に停止する。

命令内容に基づいたブレークポイント

従来のデバッガとは異なる仕組みでのデバッグ機能の提供
通常のデバッガが持つデバッグ機能とほぼ同等の機能を実現

特定の命令でブレークさせることが可能
特定の命令列でブレークさせることが可能

リソースアクセスモニタ


ゲストOSの外側から特権モードに移行する命令の実行を捉えることでゲストOSの内部で行われているファイルシステムへのアクセスを監視2008/10/1010ステルスデバッガコマンド一覧
分類

コマンド

概要

ブレークポイント.setbp [address]

ブレークポイントのセット.delbp [address]

ブレークポイントの削除.showbp

ブレークポイントの一覧.trace start [pid] [filename]

実行トレース開始.trace end [pid] [filename]

実行トレース終了.ss

シングルステップ実行.tb

Translation Blockステップ実行.mem [address] [bytes]

addressからbytes分メモリ表示.write [address] [value]

addressに値(value)をセット.mon start

ファイルアクセス監視を開始.mon end

ファイルアクセス監視を終了.reg

レジスタ値一覧.setreg [reg] [value]

レジスタ(reg)に値(value)をセット

トレース

ステップ実行ステップ実行
メモリ操作
メモリ操作
ファイルモニタ
レジスタ操作
レジスタ操作2008/10/10※その他…ゲストOS内でCtrl+Shiftでブレーク11実行命令に基くブレークポイント
 従来のブレークポイントはアドレスに基き設定される
 実行命令に基くブレークポイント
 実行命令に基きデバッギをブレークさせるブレークポイント
 例1 ret命令が実行されたブレーク
 例2 pop,pop,retの命令列が実行されたらブレーク
OEPへジャンプする部分のジャンプコードをブレークさせてOEPを検出するのに利用する
jmp OEP
call OEP
ret
etc…
2008/10/10

オリジナル
コードの展開OEPへのジャンプ

12
OEP

リソースアクセスモニタ
 ゲストOSの外側からゲストOS内でのリソース(ファイル)アクセスを監視する
 ユーザモードからカーネルモードへ移行する命令の実行を契機にゲストOSのメモリやファイルシステムの情報を調べることで、リソースへのアクセスを監視する例) hoge.txtをCreateFileした場合
Kernel32.dll
Ntdll.dll…
sysenterNtoskrnl.exe…
Ntoskrnl.exe

2008/10/10

CreateFile(C:¥hoge.txt,…);
NtCreateFile(C:¥hoge.txt,…);KiSystemService();
NtCreateFile(C:¥hoge.txt, …);

仮想CPUでここを捉えて、引数に渡されている値をログ出力する

13

実装環境
CPUメモリHost OS
Guest OSIntel Core2 Quad 2.66GHz
SDRAM 2GB
Windows XP SP3 Pro
Windows XP SP0 Pro

VMM

Qemu 0.9.1 without KQEMU

2008/10/10

14CCC Dataset 2008検体による評価

2008/10/10

15

前調査
RegMon FileMon
OllyDbg

LordPE

2008/10/10

16

前調査
RegMon FileMon
Process Monitor
OllyDbg

LordPE

IDA pro2008/10/10

17

ステルスデバッガを利用したCCC
Dataset 2008検体の解析
1. 動的解析
1. リソースアクセスモニタ
2. トレース実行

2. アンパッキング
1. 実行命令に基くブレークポイントでOEP候補を検出
2. デバッギをOEPで停止させる
3. デバッギのメモリをダンプ

3. 静的解析 by IDA pro
1.
2008/10/10

がんばる
18

リソースアクセスモニタによる動的解析#>.mon start
プロセスの起動順序(PID) 2020→2028→112→120[pid=2020] C:¥DOCUME~1¥UserName¥LOCALS~1¥Temp¥~temp02023628362.tmp？

[pid=2028] C:¥DOCUME~1¥UserName¥LOCALS~1¥Temp¥~temp02023628362.tmp[pid=2028] C:¥share¥ccc_malware.exe[pid=2028] ¥SICE[pid=2028] ¥NTICE
ドライバファイルにアクセス[pid=2028] ¥SIWDEBUG[pid=2028] ¥SIWVID[pid=2028] ¥FILEMON…
[pid=2028] ¥NTICE
本体？
[pid=2028] C:¥share¥ccc_malware.exe[pid=2028] C:¥WINDOWS¥System32¥NVCOM.EXE[pid=112] C:¥DOCUME~1¥UserName¥LOCALS~1¥Temp¥~temp02023628362.tmp[pid=120] C:¥DOCUME~1¥UserName¥LOCALS~1¥Temp¥~temp02023628362.tmp[pid=120] C:¥WINDOWS¥System32¥NVCOM.EXE[pid=120] ¥SICE[pid=120] ¥NTICE
hostsファイルにアクセス[pid=120] ¥SIWDEBUG[pid=120] ¥SIWVID…
[pid=120]¥NTICE
2008/10/10[pid=120] C:¥WINDOWS¥System32¥drivers¥etc¥hosts…

FileMonなどでは取得できなかったファイルアクセスモニタ
が可能
19全実行命令トレース>.trace start [pid]0x00405c29: inc edx
0x00405c2a: test al,al
0x00405c2c: jne 0x405bff
0x00406d5f:
eax,0x1
0x00405bff:
movzxcmp
ecx,BYTE
PTR [edx]
0x00406d62:
jne
0x406e670x00405c02: movzx eax,al
0x00406d68:
DWORD PTR [ebp-32],esi
0x00405c05:
cmp mov
eax,ecx
0x00406d6b:
mov DWORD PTR [ebp-36],esi
0x00405c07:
ja
0x405c26
0x00406d6e:
DWORD PTR [ebp+24],esi
0x00405c09:
sub cmpecx,eax
0x00406d71:jne 0x406d7b
0x00405c0b:
inc ecx
0x00406d7b:esi
0x00405c0c:
mov push
ebx,ecx
0x00406d7c:
esi
0x00405c0e:
shr push
ecx,0x2
0x00406d7d:
push DWORD PTR [ebp+16]0x00405c11:
lea edi,[ebp+eax*1-280]
0x00406d80:
DWORD PTR [ebp+12]0x00405c18:
mov push
eax,0x20202020
0x00406d83:
xor es:[edi],eax
eax,eax
0x00405c1d:
repz stos
0x00406d85:
DWORD PTR [ebp+32],esi
0x00405c2e:
pop cmpedi
0x00406d88:
al
0x00405c2f:
pop setne
ebx
0x00406d8b:
0x00405c30:
push lea
0x0 eax,[eax*8+1]
0x00406d92: push eax
0x00406d93: push DWORD PTR [ebp+24]
0x00406d96: call ds:0x408030
0x00406d9c: mov edi,eax
2008/10/10
0x00406d9e: mov DWORD PTR [ebp-40],edi
0x00406da1: test edi,edi
0x00406da3: je
0x406e67

数々のAnti Debug技術
・rdtscによる時間計測
・シングルステップチェック
・例外による状態遷移
・API呼び出しのモニタチェック
・VMware検知

ステルスデバッガではこれらのAnti Debug技術を回避して検体をデバッグすることが可能

20

高機能パッカーAのOEPジャンプの特徴
二つのオリジナルバイナリを高機能パッカーAでパッキングして、トレースを取得
0x0108f37e: pop fs:DWORD PTR [eax]0x01072389: add eax,0xffffff4b0x0108f381: pop ebx
0x0107238e: cmp BYTE PTR [eax],0xe90x0108f382: call 0x108f388
0x01072391: jne 0x107230a
0x0108f388: pop eax
0x01072397: mov BYTE PTR [eax],0xe8
popf
0x0108f389: add eax,0xffffff4b0x0107239a: popf
popa
0x0108f38e: cmp BYTE PTR [eax],0xe90x0107239b: popa
ret
0x0108f391: jne 0x108f30a
0x0107239c: ret
ret
0x0108f397: mov BYTE PTR [eax],0xe8
0x010075f6: ret
ret
0x0108f39a: popf
0x010075ee: ret
ret
0x0108f39b: popa
0x010075b3: ret
ret
0x0108f39c: ret
0x010075a2: ret
ret
0x01004055: ret
0x01007562: ret
ret
0x01004044: ret
0x0100753d: ret
ret
0x01004008: ret
0x010074d7: ret
ret
0x01004005: ret
0x010074c4: ret
0x0100739d: push 0x70
0x01003fe6: ret
0x0100739f: push 0x1001898
0x01003fc1: ret
オリジナルコード
0x01003f5b: ret
0x010073a4: call 0x1007568
0x01003f48: ret
0x01003e21:
push 0x70
2008/10/100x01003e23: push 0x1001390
オリジナルコード0x01003e28: call 0x100400c

21

OEPの検出 「popf,popa,2回以上のret」でブレークさせるシグネチャを作成して検体を実行
0x0049f389: add eax,0xffffff4b0x0049f38e: cmp BYTE PTR [eax],0xe9
0x0049f391: jne 0x49f30a
0x0049f397: mov BYTE PTR [eax],0xe8
0x0049f39a: popf
0x0049f39b: popa
0x0049f39c: ret
0x0042bdcb: ret0x0042bdab: ret
0x0042bd8b: ret
0x0042bd60: ret
0x0042bd35: ret
0x0042bd20: ret
0x0042bc64: ret
0x0042bc30: ret…
2008/10/10…
0x00427eab: ret
0x00427eaa: ret
0x00427ea7: ret
0x00427e6b: ret
0x00427e10: ret
OEP?
0x00427dfd: ret
0x00427d20: call 0x4a5f52
0x004a5f52: call 0x49f3be0x0049f3be: call 0x49f3c4
0x004a5f57: mov eax,DWORD PTR [eax+200]

22アンパッキング OEPでブレークしたらメモリをパッチして対象プロセスを無限ループに突入させる

 #>.write 0x427d20 0xeb
 #>.write 0x427d21 0xfe
 ゲストOS内からダンプツールを利用して対 従来デバッガでは解析することが困難な検体を容易にアン象プロセスをダンプ
パッキング ImportRECを利用してIATを再構築
SDPC:00411BE7 push esi
SDPC:00411BE8 push esi
SDPC:00411BE9 push esi
SDPC:00411BEA push [ebp+lpCommandLine]
SDPC:00411BED mov[ebp+Dst], 44h
SDPC:00411BF4 push esi
SDPC:00411BF5 mov[ebp+var_24], si
SDPC:00411BF9 call
ds:CreateProcessA
SDPC:00411BFF test
eax, eax
2008/10/10

23

IDA proによる静的解析•Hostsファイルの書き換え、アンチウィルスベンダ、セキュリ
ティベンダ、OSベンダなどへのWebアクセスの禁止•HKLM¥SOFTWARE¥Microsoft¥Windows¥CurrentVersion¥Run/¥RunServicesへの自身のバイナリの登録•バイナリ配布用のFTPサーバの立ち上げ•DLサーバの立ち上げ•MS03-026/MS02-061?(SQLExec脆弱性)を狙った攻撃
コード•各種プロセスの停止 F-AGOBOT.EXE, HIJACKTHIS.EXE,_AVPM.EXE, _AVPCC.EXE, _AVP32.EXE, VSCHED.EXE,その他、Anti Virus、セキュリティソフトなどの非常に多くのプロ
セス•“login”,“!login”,”hashin”,”!hashin”,”!secure”,”secure”,etcの文字列を含むパケットを盗聴•その他まだまだ大量の機能
2008/10/10

24

考察 Qemu検知技術


既存Qemu検知手法の1部（3/5）対処済み
未知の手法により検知される可能性がある
仮想マシンすべてをソフトウェアで記述しているため、理論上は検知されない仮想マシン環境が作れるはず？

 OEPジャンプ箇所検出の有効性（他のパッカーでは？）

単純なパッカーでは誤検知が発生する場合がある

未知のパッカーの場合、検出はできない

複数の候補の中から人間が目視Genericな命令列でとらえるという手はあるが,,,パッカーの振る舞いをもう少し詳細にみる

2008/10/10

ループの回数＋ジャンプ箇所25

まとめ 様々なAnti Debug機能を回避しつつデバッグを行うことが可能なステルスデバッガを提案、実装を行った。
OSやCPUのデバッグ機能支援機構に頼らないデバッグ機能
タイムコントロール機能
リソースアクセスモニタ
実行命令に基くブレークポイントによるOEPの検出

 CCC Dataset 2008検体による評価を行い、従来のデバッガでは解析困難な高機能なAnti Debugを搭載した高機能パッカーAをアンパッキングしオリジナルコードの抽出に成功した。

2008/10/10

26