MWS Cup 2016
課題2: 静的解析
中津留 勇
2016/12/07

1

課題2 担当

中津留 勇

稲垣 俊

•SecureWorks Japan 株式会社

•セコム株式会社2

課題2 の変わらぬテーマ• 静的解析を通じマルウェアを正しく理解する
最新情報を得る
実務に近い作業
3

MWS Cup2016
課題2 解説4

Tick/Daserf• 日本国内で数年前から発生していた標的型攻撃

http://www.symantec.com/connect/blogs/tick-cyberespionagegroup-zeros-japan

http://www.lac.co.jp/security/report/pdf/20160802_cgview_vol2_a001t.pdf

5

課題2
1. コード難読化
2. 暗号アルゴリズム（選択式）
3. 暗号化/エンコード処理
4. 暗号化されたデータの復号
5. 設定情報の調査
6

ポイント
難しく捉えない• アセンブリ言語そのものは単純
分かりやすい情報を探す• 文字列、定数、API
すべてのコードを読まない• 終わりません7

1. コード難読化• 難読化が行われている箇所を探す–何が「普通のコード」かを知っておく必要がある

8

1. コード難読化• 答えはすぐ下に無駄なデータを挿入し、jmp 命令で飛ばしながら実行する9

1. コード難読化• API 呼び出しの難読化も文字列を分割して分かりづらくしている

動的な名前解決をすることで API 名が見えないようにしている10

2. 暗号アルゴリズム• AES, DES, 3DES, RC4, TEA?

11

2. 暗号アルゴリズム
各選択肢の調査• AES: SPN構造のブロック暗号• DES、3DES: Feistel構造のブロック暗号• RC4: ストリーム暗号• TEA: Feistel構造のブロック暗号

アセンブリ言語を読み特徴を抽出• sub_41978C を呼んでから、XOR のループ
• AES などで使用される定数を参照していない• 1バイトずつ XOR していてストリームっぽい122. 暗号アルゴリズム• sub_41978C

0xFF までを配置した配列を作成している

暗号アルゴリズムは RC4
13

3. 暗号化/エンコード処理• 暗号なのかエンコードなのか、そして鍵や変換テーブルは何か
鍵または変換テーブルのような文字列

14

3. 暗号化/エンコード処理• 具体的な処理を「さらっと」読み解く
0x40 = 64

シフト演算が多い
15

3. 暗号化/エンコード処理
シフトするビット数と一致している= Base64
デコード UO• Base64
Y010110010100111101010101
2220

61

21

W

U9V
16

3. 暗号化/エンコード処理• 具体的な処理を「さらっと」読み解く
0x21 = !
Base64 のパディング

変則 Base64 デコード
変換テーブル:
GKLMopqr6vQBRSwxyz0H1234ZabTcdefg789^/CDAENOPUIVWYJhijklXstu5mnF!
17

4. 暗号化されたデータの復号• Daserf が実行したコマンドの結果が暗号化される方式と同じ方式で暗号化した文字列の復号

18

4. 暗号化されたデータの復号• デコードスクリプトの実装–問2、3 の解析結果 + α で復号可能

途中で RC4 を呼ぶ

変則 Base64
19

4. 暗号化されたデータの復号• sub_41999C の前半
RtlCompressBuffer
で圧縮

圧縮フォーマットは
LZNT1
20

4. 暗号化されたデータの復号• sub_41999C の後半
RC4鍵:
bn32gkj324kgd43<dkh6Jdhghsd?dgh;y4dsgserd

RC4 で暗号化しているのは2バイト目から21

4. 暗号化されたデータの復号
変則 Base64 デコード

2バイト目以降を RC4 復号

復号したデータを LZNT1 で展開
22

4. 暗号化されたデータの復号
In [1]: %paste
import string, base64, lznt1, re, structfrom Crypto.Cipher import ARC4
standard_b64table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='daserf19_b64table = 'GKLMopqr6vQBRSwxyz0H1234ZabTcdefg789^/CDAENOPUIVWYJhijklXstu5mnF!'
rc4key = 'bn32gkj324kgd43<dkh6Jdhghsd?dgh;y4dsgserd'
def custom_b64decode(s, custom_table):s = s.translate(string.maketrans(custom_table, standard_b64table))return base64.b64decode(s)def decrypt(data):
enc = custom_b64decode(data, daserf19_b64table)
rc4 = ARC4.new(rc4key)
dec = rc4.decrypt(enc[1:])out = lznt1.dCompressBuf(dec)return out## -- End pasted text -In [2]:decrypt("GeB57VGaerHM0y8Wg73sZE^gpfmCpDPAYUBCIU32ahwKDKje/^BNlnav4u9hs^Gwo9GQq7L3XXs6AK
oHPvVF/DPSGJC8")
Out[2]: "Congratulations! Now you can decrypt Daserf's GET request!"23

5. 設定情報の調査• 格納先、暗号/エンコード方式24

5. 設定情報の調査• データの読み込み 1
自身をオープン

FILE_END から-490 バイト目にファイルポインタを移動

24バイト読み込み25

5. 設定情報の調査• データの読み込み 2-466バイトの位置から466バイト読み込み466バイトのデータを24バイトの鍵で RC426

5. 設定情報の調査• ファイル末尾に設定データを保持

実行ファイル-490-466

RC4 鍵
設定データ
27

採点結果
25

20

15

10

5028

来年度に向けて29自分たちの課題
0 か 1 か問題の解決•ある程度解消できたがまだまだテーマ選定の難しさ•自動化などを静的解析で適用することの困難さ•現状のやり方では現場でリアルなマルウェアを見ている人が必須
作成委員不足•みんな静的解析やろう！
•セキュリティ賛歌・UN頼みあたりが良さそう
30

みんなの課題• 静的解析の知見を溜めようWeb•セキュリティ・キャンプ全国大会2015でのマルウエア分析講義(2015-09-10)
https://www.jpcert.or.jp/magazine/acreport-seccamp.html•リバースエンジニアリング入門 - ＠IT
http://www.atmarkit.co.jp/ait/series/2614/•Edomae 2015 - マルウェアを解析してみよう
http://www.slideshare.net/SatoshiMimura/edomae-2015

書籍•Practical Malware Analysis | No Starch Press
https://www.nostarch.com/malware•O'Reilly Japan - アナライジング・マルウェア
https://www.oreilly.co.jp/books/9784873114552/

過去問•ML に投げてるので、それを入手する•データセットに入っている資料を読む31

Thank you!
32