コンパイラ出力コードモデルの尤度に基づくアンパッキング手法
rootkitのように，のように，そしてゲノムそしてゲノム解析
ゲノム解析のように解析のように

マルウェア対策人材育成ワークショップ 2008
岩村誠*1,*2，伊藤光恭*1，村岡洋一*2*1NTT情報流通プラットフォーム研究所*2早稲田大学

発表の流れ 研究の背景 従来のアンパッキング手法とその課題
 提案手法 メモリアクセス監視手法
 オリジナルコード特定方法

 実験結果 CCC DATAset 2008のマルウェア検体

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

2

研究の背景 マルウェアの種類数の急増
 最近では一日当たり数千検体の新種が収集される．
 マルウェアのトレンドを掴むのも大変，対策の優先度決めも・・・ 多数のマルウェアを効率的に管理・解析するには分類技術が非常に有用．マルウェアの分類技術は大きく２つに分けられる．
 挙動に基づくもの
 アンパッキングや逆アセンブルを要さない．
 ボットでは挙動を網羅的に把握することが困難．

 プログラムコードに基づくもの
 マルウェアの潜在的な機能を考慮した分類が可能．
 ただ従来の分類技術では，アンパッキング済
アンパッキング済・逆アセンブル済
アセンブル済であることが前提であることが前提．
前提

アンパッキングの自動化が重要
マルウェア対策研究人材育成ワークショップ 2008

【従来研究】
・OllyBonE
・Renovo・Saffron3

Saffron（従来研究）
 機能

 書込後に書込後に実行された
実行されたメモリされたメモリ領域
メモリ領域を領域を検出する
検出することで，オリジナする
ルエントリポイント （アンパッキング完了）を検出する．

 実装
 Windowsカーネルのページフォールトハンドラをフックする．
 全メモリページ(PTE)にSupervisor bitを設定する．
 全メモリページを書込監視状態（左）とし，発生したアクセス種別によって，状態を遷移させる．
WRITE
書込監視状態READ or EXEC

実行監視状態EXEC

READ or WRITE

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

OEP検出4

Translation Lookaside Buffer (TLB)
特徴


PDE/PTE（物理アドレス変換用テーブル）専用のキャッシュ．
命令フェッチ用とデータアクセス用，2種類のTLB（ITLB/DTLB）.
PTEを更新しただけでは，古いTLBが生きたままになる．
通常はinvlpg命令等で明示的にTLBをフラッシュさせる．

応用[Saffron]監視状態に対応するTLBのSupervisor bitを設定することで，監視対象のアクセスでPFを発生させる．
 [Shadow Walker]同じリニアアドレスであっても，命令フェッチ時とデータアクセス時で別の物理アドレスを参照させることが可能になる.
余談
Saffronの場合（Supervisor bit）
書込監視状態実行監視状態

PTE

1

1

ITLB

0

1

DTLB

1

Shadow Walkerの場合Present bit

Phys. Page

PTE

0-ITLB

1

XXXX

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

1

YYYY

5

Saffronの問題点
 仮想マシン上で動作させる場合
 ほとんどの仮想マシンには，TLBがが実装されてい実装されていない（もしくは，実機と実装が違う）．
ない VMwareの場合，特権モードをまたぐときに，ITLBがフラッシュされてしまう．
Supervisor bitをクリアした状態を作り出せない．

 多重にパッキングされている場合
 オリジナルコードとして，アンパッキング
アンパッキング途中アンパッキング途中の途中のコードがコードが検出されてしまう．
検出
マルウェア対策研究人材育成ワークショップ 2008

6

提案手法
TLBへの依存を無くし，仮想仮想マシン仮想マシン上マシン上で動作可能にする
動作可能Supervisor bitではなく，監視状態に応じたパーミッションの設定を行う


書込監視時はread-onlyビットを設定
実行監視時はXDbit (NXビット)を設定

複数の候補からオリジナルコードオリジナルコードをオリジナルコードを特定する
特定

詳細は後述．

監視起動
検体【副産物】不要なPFが発生しなくなり，解析速度もアップ↑

監視対象プロセス

メモリアクセス監視用
カーネルドライバ

オリジナルコード特定（尤度算出）

出力読込オリジナルコードの候補

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

出力

オリジナル
コード7

オリジナルコードの特定

前提





オリジナルコードはコンパイラが出力したコード．
アンパッキングの処理ルーチンはコンパイラ出力コードっぽくない．

「コンパイラが出力したバイナリっぽさ」
リバースエンジニアには分かる！？

call near ptr loc_2908+1
loc_2908:
call fword ptr [edi[edi-7Fh]movdword ptr [ebp[ebp-1], 1F89FFFFhmov[edi+4], edx
pop
eax
rdtsc
push eax
まだmov
push
mov
mov
testjzpushpush

アンパッキング中
だな・・・マルウェア対策研究人材育成ワークショップ 2008

edi,edi, edi
esi
esi,esi, ecx
eax,
eax, [esi+30h]
eax,
eax, eax
short loc_100A41F
eax
40h
お？
それっぽい！

8

リバースエンジニアの脳みそ コンパイラ出力っぽい よく使う命令（mov edi,edi）が出てくる

 コンパイラ出力っぽくない あまり使わない命令（rdtsc）が出てくる
 命令の途中へ分岐（call loc_2908+1）してる提案手法の提案手法のアプローチ

命令の出現確率を隠れマルコフモデルでモデル化し，「分岐命令の宛先は命令の先頭」という知見を盛り込みつつ，コンパイラ出力コードモデルの尤度を算出する
マルウェア対策研究人材育成ワークショップ 20089

隠れマルコフモデル
お天気系列
X={はれ，はれ，くもり，あめ，くもり}【お天気モデル】
東京のモデルパラメータθ
99%

春
はれ:40%
くもり:30%
あめ：30%

1%1%

冬
はれ:50%
くもり:30%
あめ：20%
99%

夏
はれ:20%
くもり:30%
あめ：50%
1%

1%

秋
はれ:40%
くもり:30%
あめ：30%

99%

Forward algorithm∑ P( X , T | θ ) = P( X | θ ) = L(θ | X ) 度尤all T

東京のお天気パラメータが与えられたときの，Xが起きる条件付確率．
Xが与えられたときのθの尤度，ともいう．

【nullモデル】

はれ:33%
99%
くもり:33%
マルウェア対策研究人材育成ワークショップ
2008
あめ：33%

事前の知見がない
nullモデルと比較して，L(θ|X)>P(X)なら東京のお東京のお天気のお天気っぽい
天気っぽい．
っぽい．
100%

10

隠れマルコフモデル【コンパイラ出力コードモデル】
モデルパラメータθは既知のコンパイラ出力コードから学習

X={0xEB,0x01,0xFF,0xC3,…}

Forward algorithmxx%

命令
0x00:xx%:
0xff：xx%

xx%

xx%

データ
0x00:xx%:
0xff：xx%xx%∑ P( X , T | θ ) = P( X | θ ) = L(θ | X ) 度尤all T

コンパイラ出力コードモデルのパラメータが与えられたときの，Xが起きる条件付確率．
Xが与えられたときのθの尤度，ともいう．

【nullモデル】

データ
0x00:100/256:
マルウェア対策研究人材育成ワークショップ 2008
0xff:100/256

事前の知見がないnullモデルと比較して，L(θ|X)>P(X)ならコンパイラ出力
コンパイラ出力コード
出力コードっぽい
コードっぽい．
っぽい．
100%

11

「分岐命令の分岐先は命令」という制約
 たとえば以下のようなバイト列の場合
 [1]0xEB[2]0x02[3]0x90[4]0x90[5]0xc3
JMP [5]

NOP

NOP

RET

通常のコンパイラが出力したコードであれば以下の条件を満たす．
・[1]が命令の先頭であれば[5]は命令の先頭・[5]が命令の先頭でなければ [1]は命令の先頭でない．
分岐命令と解釈できる入力バイト値をxi,その宛先をxjとし，{i,j}の集合をBxとしたとき
上記制約を満たしつつXが出力される確率は，次のように近似することでO(N)で計算可能P ( X ,∀ {i, j} ∈ BX (ti ≠ 命令 or t j = 命令) | θ )≈ P ( X | θ ) ∏ (1 − P (ti = 命令 | X , θ ) P (t j ≠ 命令 | X , θ )){i , j }∈Bx
マルウェア対策研究人材育成ワークショップ 2008

Nullモデル 12と比較

実験概要
 仮想OS上で研究用データセットCCC DATAset
2008のマルウェア検体のアンパッキングを試みた
 仮想化ソフトウェア：VMware Server 1.0.4
 ホストOS：Windows XP SP3
 ゲストOS：Windows XP SP1

 ゲスト環境 CPU: Intel Xeon 2.66GHz x 1
 メモリ：512MB

 モデルパラメータθ Firefox 3.0.1に含まれるxul.dllを利用
MS C++により出力されたアセンブリを用いて学習
データ状態はヌルモデル
マルウェア対策研究人材育成ワークショップ 200813

実行画面書込検出
実行検出

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

14実験結果
約230のオリジナルコードの候補を抽出．
アンパッキング中のコードとアンパック後のコードを完全に識別できた．

尤もらしい

1.00E+05

6.68

6.61

6.57

6.54

6.52

6.11

5.94

5.61

5.43

5.26

4.89

4.62

4.41

3.97

1.02

0.99

0.97

0.95

0.90

0.48

0.40

0.38

0.37

0.35

0.34

0.28

0.27

-5.00E+04

0.17

0.00E+00
0.14

Logarithm of Likelihood Ratio

5.00E+04-1.00E+05-1.50E+05-2.00E+05-2.50E+05-3.00E+05

尤も
らしくない

-3.50E+05-4.00E+05
Time (sec)
PID=364h

再起動1回目

PID=5C0h

PID=4F0h

再起動2回目

PID=400h

再起動3回目

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

最後に お話したこと
 TLBの実装が不十分な仮想マシンにおいても，動作可能なアンパッキングのためのメモリアクセス監視機構の実現
 複数のオリジナルコードの候補から，オリジナルコードを特定する手法を提案・有効性を示した

 今後の予定 さらに多くのマルウェアによる評価
 プログラムコードに基づくマルウェア分類へ・・・
マルウェア対策研究人材育成ワークショップ 2008

16

付録

従来のアンパッキング手法
 パッカー識別＆個別アンパッカー
 PEiD等，シグネチャによるパッカーの識別 パッカーに応じた個別アンパッカーの利用
e.g., upx –d 以下のようなケースに対応できない．
 パッカー識別を騙すマルウェアの存在
 新たなパッカーの出現
 汎用的なアンパッカー
 メモリ監視により， 「書込み後，実行される」領域をとらえることで，マルウェアのオリジナルコード（動的動的に動的に生成された生成されたコードされたコード）を検出コードする．使われているパッカーに依存しない．
OllyBonE, Renovo, Saffron, …
マルウェア対策研究人材育成ワークショップ 200818

Intel x86におけるページング機構
リニアアドレスから物理アドレスへの変換
リニアアドレス
CR3

PD index

PT index

Page Directory

Offset物理アドレス空間

Page Tables

Pysical address

PDE
アクセス制限フラグ
・Supervisor bit
・Read-only bit[PAE]
・XDbit (NX bit)

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