多段パックされたマルウェアからのコード取得

中村徳昭† 森井昌克†
伊沢亮一‡ 井上大介‡ 中尾康二‡
神戸大学大学院工学研究科†
独立行政法人情報通信研究機構‡

研究背景

1

インターネットの普及に伴いマルウェアが蔓延被害が多発！

迅速な解析が求められているが，解析には多大な労力が必要
数が多い．

解析を妨害するために暗号化(パッキング)が施されている．
？

大まかな機能で分類し，まとめて解析

パッキングの手法は巧妙化の傾向に！

研究目的

2

パッキング
実行可能な形式を保ったまま実行ファイル本来のプログラムコード（以下，オリジナルコードと呼ぶ）を暗号化・圧縮すること．
通常パッキング : オリジナルコードをすべて復号後，順に実行
多段パッキング : オリジナルコードを複数のセクションに渡って実行

問題点
展開の処理が複雑で完全なオリジナルコードを取得するのは難しい

不完全でも取得して利用することを考える
研究目的
多段パックされた検体からオリジナルコードを汎用的に取得，マルウェアの類似度判定に利用

発表の流れ１．パッキングの構造- 通常パッキング- 多段パッキング

２．多段パッキングに対するオリジナルコード取得- オリジナルコード取得法- 評価実験1

３．コードを用いた類似度判定- 類似度判定法，類似度可視化- 評価実験2

４．まとめ

3

発表の流れ１．パッキングの構造- 通常パッキング- 多段パッキング

２．多段パッキングに対するオリジナルコード取得- オリジナルコード取得法- 評価実験1

３．コードを用いた類似度判定- 類似度判定法，類似度可視化- 評価実験2

４．まとめ

4

通常パック(UPX)の構造

5

パッキング

A:0

PE

PE
実行
UPX0（空メモリ）

.text

メモリ展開
UPX1

.data
.rsrc

圧縮.rsrc

A:1000
パック前EXEファイル

パック後EXEファイル

圧縮コード+
復号ルーチン

UPX1セクションに復号ルーチンと圧縮データが存在し，UPX0セクションに.text，.data等のセクションがまとめて展開される．

多段パックの構造

6

多段パッキング
A:0

PE

PE
実行

.text

.text
メモリ展開
.data.data.rsrc.rsrc
A:1000

圧縮…

パック前EXEファイル

書き換え…
パック後EXEファイル

圧縮コード+復号ルーチン+IAT書き換え用コード（パッカーの種類に依存）
実行時にAPIの値が参照される

Import Redirection

7

Import Redirection
IATの値をヒープに作成したダミーコードのアドレスに書き換える手法

call dword ptr [4080E8]…

通常のメモリ呼び出し図

4080DC 77E241EB

kernel32.GetStringTypeA

4080E077E3C866

kernel32.GetStringTypeW

4080E4NULL

4080E877D1ADD74080EC

NULL

user32.MassageBoxA

Import Redirection

8

Import Redirection
IATの値をヒープに作成したダミーコードのアドレスに書き換える手法

call dword ptr [4080E8]…

Import Redirection 使用時

4080DC 007F0000
4080E0007F0010

4080E4NULL

4080E800810000

4080EC

NULL

00810000 mov eax, 77D1ADD700810005 jmp eax

書き換えの手法はパッカーによって様々; eax=user32.MassageBoxA

9Import Redirectionによる影響
元EXEのオリジナルコード…

…
PUSH DWORD PTR DS:[1014D6C]
CALL DWORD PTR DS:[<&USER32.MessageBoxW>]
JMP calc.01005A73
PUSH 1CALL DWORD PTR DS:[<&USER32.GetClipboard>]
MOV ESI,EAX
CMP ESI,EBX
MOV DWORD PTR SS:[EBP-C],ESI
JE calc.010059CA
PUSH ESICALL DWORD PTR DS:[<&KERNEL32.GlobalLock>]

多段パックから取得できたコードPUSH DWORD PTR DS:[1014D6C]
CALL DWORD PTR DS:[10011A8]
JMP calc.01005A73
PUSH 1CALL DWORD PTR DS:[10010EC]
MOV ESI,EAX
CMP ESI,EBX
MOV DWORD PTR SS:[EBP-C],ESI
JE calc.010059CA
PUSH ESICALL DWORD PTR DS:[1001088]…

…

未知の多段パックに対しては，IATの再構築は行えず
API名は取得できない
コード取得率はアドレス中のオペコードで比較して評価する

発表の流れ１．パッキングの構造- 通常パッキング- 多段パッキング

２．多段パッキングに対するオリジナルコード取得- オリジナルコード取得法- 評価実験1

３．コードを用いた類似度判定- 類似度判定法，類似度可視化- 評価実験2

４．まとめ10オリジナルコードの取得

11

EIP（インストラクションポインタ）： 現在処理を実行しているアドレスの値を格納
00000

PE header

01000

Step2:EIPの制御が.textセクションへと移る瞬間をブレー
クポイントによって捉える．ここで停止した地点がOEP

.text
14000
16000

Step3: .textセクションをダンプ.data

EIP.rsrc

1F000…
多段パック後EXEファイル

Step1: 新たに作られたセクションで展開処理を行っていき，EIPが.textセクションにアクセスするまで実行を進める

基本ブロック分割

12

基本ブロック： 分岐命令で区切られた連続した命令列．
基本ブロックの例； --------------------------cmp
－－－－
mov
－－－－
push
－－－－
push
－－－－
call
－－－－
add
－－－－
jmp －－－－

分岐命令の例jzjne
jljge．．．

jump if zero
jump if not zero
jump if lessjump if greater or epual．．．

コード列

分岐及びretで１ブロックの終了

実行コードオリジナルコード取得率の算出

13オリジナルコードの取得率は基本ブロックの一致率によって定義する．
ブロック一致率：：

Bとのブロック一致数
マルウェアA総ブロック数

A・・・

オリジナルコードブロック群

B・・・

多段パックから取得できた
コードブロック群実験１：オリジナルコード取得率の算出

14実験１：１．168検体を用意して，それぞれ3種類の多段パッカー（tElock,PESpin,yoda’s Protect）でパッキングを行う（計504パターン）．
検体実行，提案手法によるコード取得
２．元検体と基本ブロック単位の比較を行うことで，オリジナルコード取得率を算出する．
tElock

PESpin

実験結果
yoda’s Protect

実験結果１：オリジナルコード取得率15

ほとんどの組み合わせで，パック以前のオリジナルコードブロックを取得することができた．
10090

オリジナルコード取得率 （％）

807060tElock50

PESpin4030

yoda's Crypter

20100020406080
検体番号100120140160

発表の流れ１．パッキングの構造- 通常パッキング- 多段パッキング

２．多段パッキングに対するオリジナルコード取得- オリジナルコード取得法- 評価実験1

３．コードを用いた類似度判定- 類似度判定法，類似度可視化- 評価実験2４．まとめ

16

類似度判定17類似度判定も基本ブロックの一致率によって定義する．
が高い

ブロック一致率：

AがBの機能を多く有している．
：

Bとのブロック一致数
マルウェアA総ブロック数

・・
・

マルウェアAのコードブロック群

・・
・

マルウェアBのコードブロック群

類似度可視化18総当たりで類似度を算出すると関係が複雑グラフによる可視化

検体Aから検体Bへエッジ(辺)をつなぐ条件：

Bとのブロック一致数
マルウェアA総ブロック数（しきい値）※BからAに対しても条件が成り立てば双方向からエッジをつなぐ

ABA

類似度可視化に用いた手法
Fruchterman-Reingold(FR)法 :エッジが密なほど検体間の距離が近い
Newmanアルゴリズム :関連度の低いエッジから削除してクラスタリング

BFruchtermanReingold（FR）法FR法(概要)：
リンクの強さを電磁力に見立てて，距離で類似度を示したマップ．

リンクを持つもの同士には引力が，リンクを持たないもの同士には弱い斥力が働く．
リンクの強さは距離の２乗に反比例する．

19

Newman Algorithmによるクラスタリング

20

Newman Algorithm(概要)：トップダウンアプローチでのクラスタリング手法．
コミュニティ間を跨ぐ存在になる可能性の高いエッジから順に切り離す．
任意の2ノード間の最短パスに最も多く含まれるリンク

ステップ1

ステップ2

ステップ3

実験２：類似度判定・可視化

21

目的- コードの本質的な部分が取得できているかどうかを評価．
- 多段パックの種類によらず，同じような類似度判定が行えるかどうかを判定．
使用検体は，実験１で用いた168検体(パック無し+3種の多段パッカー)(1) パック無し(2) tElock≒(3) PESpin≒(4) yoda’s Protect≒

実験結果２：類似度判定

22168検体に対して総当たりで類似度判定を行った．
しきい値 Z= 90(%)(1) パック無し168検体(2) tElockでパックした168検体

PESpin，yoda’s Protectの類似度判定結果

実験結果２：類似度判定

23168検体に対して総当たりで類似度判定を行った．
しきい値 Z= 90(%)(1) パック無し168検体
クラスタ4(2) tElockでパックした168検体
クラスタ5

クラスタ1

クラスタ4
クラスタ1

クラスタ2
クラスタ3
クラスタ5

クラスタ2
クラスタ3

PESpin，yoda’s Protectの類似度判定結果

実験結果２：類似度判定

24

PESpin，yoda’s Protectでパックした検体もパック前と同様の類似度判定を行うことができた．
(3) PESpinでパックした168検体(4) yoda’s Protectでパックした168検体

まとめ25

多段パックされたマルウェアからIATを再構築していない状態のオリジナルコードを取得する手法を提案した．
168検体を3種類の多段パッカーでパッキングを行い，ほぼすべての組み合わせでオリジナルコードを取得することができた．
取得したオリジナルコードのオペコード部分をマルウェア間で比較することで類似度判定を行うことができた．
可視化して，マルウェア間の類似度関係をより分かりやすくした．