MWS Cup 2023
Static Analysis 解説

MWS Cup 2023

2023の問題担当● Static Analysis主担当○ 中島 将太 (株式会社サイバーディフェンス研究所 )● 問題作成委員○ 石丸 傑 (伊藤忠サイバー&インテリジェンス株式会社)○ 皆川 諒 (株式会社エヌ・エフ・ラボラトリーズ)○ 桑原 翼 (株式会社FFRIセキュリティ)MWS Cup 20232

課題2のテーマ● マルウェアを正しく理解する○

課題を通して解析のポイントを学習する● 最新情報を得る○

最近のin-the-wildなマルウェアを扱う● 実務に近い作業○○○

コマンドの分析
静的解析による復号スクリプトの作成
コンフィグの理解

MWS Cup 2023

3

ポイント
● 積極的に変数名や型を変更する○○

名前を付けて読みやすくしていく
デフォルトでは型情報がないことが多い● デコンパイラを信用しすぎない○○

アセンブリを確認して整合性を確認する
手動で修正する● 順番に回答する必要はないので解けそうな問題から解く

MWS Cup 2023

4

マルウェアの動作概要

コマンドを受信して動作

正規ファイルローダ
復号

MWS Cup 2023

C2

sample.dll.gzf
メモリ上で実行

暗号化されたRAT

5加工済みのGZF● MWSの問題作成にあたって以下の点に変更を加えています○○○

FLIRTシグネチャを使ったライブラリ関数のシンボルの適用
暗号鍵の変更と暗号文字列への適用
暗号化文字列のラベル変更■

MWS Cup 2023

dec_で始まるラベルは作問者が作成したヒントのための復号後の文字列を示したラベルです6Ghidra Tips: Go To● Gキーで開くGo Toダイアログにアドレスやlabelを入力○○

任意の場所に簡単に移動問題ではアドレスが指定されていることが多いので必須!

MWS Cup 2023

7

Ghidra Tips: データの定義● 定義したいデータの先頭を右クリック○

コンテキストメニューからData -> 定義する形式を選択

MWS Cup 2023

8

Ghidra Tips: データのコピー1● コピーしたい範囲を選択○

コンテキストメニューからCopy Special => 好きなフォーマットを選択

MWS Cup 2023

9

Ghidra Tips: データのコピー2● Bytesウィンドウでコピーする

MWS Cup 2023

10

Bookmarks
問題に関連するアドレスをBookmarkとして登録済み

MWS Cup 2023

11

問題一覧

MWS Cup 2023

12

競技中はここまで

MWS Cup 2023

13

結果

MWS Cup 2023

14

1. コマンド分岐

MWS Cup 2023

15

1. コマンド分岐● 復号した文字列とDAT_01255e78をstricmpで比較する処理がある○コマンド文字列の比較処理● DAT_01255e78の参照を追ってコマンド数を数える

MWS Cup 2023

16

1. コマンド分岐● いくつかの文字列は定義されていないのでデータ型を定義する○Data -> TerminatedUnicode

MWS Cup 2023

171. コマンド分岐
●●
●
●
●
●
●
●
●
●
●

SysinfoDownload
UploadFileOk
RemoteRun
ComputerShell
cddirls
delExit

MWS Cup 2023

18

1. コマンド分岐

The Answer is: 11

MWS Cup 2023

19

2. コマンド解析1

MWS Cup 2023

20

2. コマンド解析1● コマンド文字列から推定● 出力文字列から推定

MWS Cup 2023

21

2. コマンド解析1

The Answer is: システム情報の取得

MWS Cup 2023

22

3. コマンド処理2

MWS Cup 2023

23

3. コマンド処理2● RemoteRunの処理の中でWinExecが実行されている○○

WinExecの引数は初期化されたあとFUN_012221d0に渡される
おそらくこの関数でC2からのデータをコピー● この処理が開始されるアドレスを確認する

MWS Cup 2023

243. コマンド処理2

The Answer is: 01230871

MWS Cup 2023

25

4. コマンド引数

MWS Cup 2023

26

4. コマンド引数● 問題文で指定された文字列はFUN_01229310の第1引数に渡されている

dir /s "C:\Users\ghidra master\Downloads"

MWS Cup 2023

27

4. コマンド引数
DAT_01256278を参照するmemcpyの処理を追う

memcpy (void * _Dst, void * _Src, size_t _Size)

MWS Cup 2023

28

4. コマンド引数● 引数からスペースを確認し、スペース区切りで文字列を分割する● 0x400ごとに01255e78にコピー

MWS Cup 2023

29

4. コマンド引数● 引数からスペースを確認し、スペース区切りで文字列を分割する● 0x400ごとに01255e78にコピー

MWS Cup 2023

30

4. コマンド引数● コピー処理が終わった時点のデータ構造
01255e78
dir01256278/c01256678
C:\Users\ghidra master\Downloads● 01256278 = 01255e78 + 400 * 1

MWS Cup 2023

31

4. コマンド引数

The Answer is: /c

MWS Cup 2023

32

5-1. 暗号アルゴリズム

MWS Cup 2023

33

5-1. 暗号アルゴリズム● 第1引数の復号対象の文字列はFUN_01221530に渡される● 第2引数はグローバル変数をワイド文字列処理した値がコピーされる

MWS Cup 2023

34

5-1. 暗号アルゴリズム● FUN_01221530内ではグローバル変数が参照されている● 引数のデータを別のFUN_01221900関数で処理している

MWS Cup 2023

35

5-1. 暗号アルゴリズム● FUN_01221000の固定値とAES:vftableを見つける○Rijndael S-box

MWS Cup 2023

36

5-1. 暗号アルゴリズム● FUN_01221900のアルゴリズムを調査○AESと類似する

MWS Cup 2023

37

5-1. 暗号アルゴリズム● AESのビット数は？
○ラウンド数で決まる

MWS Cup 2023

38

5-1. 暗号アルゴリズム● ラウンド数は10

MWS Cup 2023

39

5-1. 暗号アルゴリズム

The Answer is: AES-128

MWS Cup 202340

5-2. 暗号鍵

MWS Cup 2023

41

5-2. 暗号鍵
● AESではKeyExpansionで暗号鍵とRijndael S-boxを使って暗号化処理に必要な鍵を生成する● FUN_01221b10にRijndael S-boxとFUN_01221000の第1引数を渡している

MWS Cup 202342

5-2. 暗号鍵
● FUN_01221000はKeyExpansionの処理のよう

MWS Cup 2023

43

5-2. 暗号鍵
● FUN_01221000の引数を辿っていく○DAT_0126c098にたどり着く

MWS Cup 2023

44

5-2. 暗号鍵
● アセンブリを確認するとDAT_0126c098には文字列"justforfun"が代入されている

MWS Cup 202345

5-2. 暗号鍵
● AES-128の鍵長は16バイト(128bit/8bit)なので鍵をヌルで拡張○’justforfun\x00\x00\x00\x00\x00\x00’● 指定の形式に変換>>> key =b'justforfun\x00\x00\x00\x00\x00\x00'>>> key.hex()'6a757374666f7266756e000000000000'

MWS Cup 2023

46

5-2. 暗号鍵

The Answer is:
6a757374666f7266756e000000000000'MWS Cup 202347

5-3. 復号スクリプト作成

MWS Cup 2023

48

5-3. 復号スクリプト作成● 5-1と5-2を基に作成
from Crypto.Cipher import AES
key = b’justforfun\x00\x00\x00\x00\x00\x00’
decipher =AES.new(key=key, mode=AES.MODE_ECB)

decipher.decrypt(bytes.fromhex("0469cb2edc87cd0557c85273c710cc0e3142
a9050eb5ca0618749c05aa57c2491b6ff98ed3cc6cc1e5f09d1a23129e0c"))

MWS Cup 202349

5-3. 復号スクリプト作成

The Answer is:
AES-ECB_is_the_most_basic_of_blo
ck_cipher_modes!

MWS Cup 202350

6-1. コンフィグ

MWS Cup 2023

51

6-1. コンフィグ1● デコンパイルでは_Source+4表記○ _Sourceはundefined4 *型(4バイト)なので4*4で0x10● Listing Viewで値を確認○EDI + 0x10を参照している

MWS Cup 2023

52

6-1. コンフィグ1● EDIの値をたどるとlocal_70のデータを参照している○○

local_70+0x10バイトからが復号対象のデータリトルエンディアンなのでデータの順番に注意

MWS Cup 202353

6-1. コンフィグ1

The Answer is: 800C06232198D06A

MWS Cup 2023

54

6-2. コンフィグ2

MWS Cup 2023

55

6-2. コンフィグ2● FUN_0123a6feの呼び出しを探すと候補が12個見つかる

MWS Cup 2023

56

6-2. コンフィグ2● 1. コマンド分岐で参照したFUN_01230730の呼び出し元を確認する● 認証確認と思われる処理がある○__stricmpの引数■■

MWS Cup 2023

4. コマンド引数の解答で示したアドレス
FUN_01222140でDAT_01262ad8からコピーされた文字列（local_2360）57

6-2. コンフィグ2

The Answer is: 01262ad8

MWS Cup 2023

58

7. ファミリ名

MWS Cup 2023

59

7. ファミリ名● エラー出力文字列をGoogle検索○

KeyBoyのIoCやYARAルールがヒット

MWS Cup 2023

60

7. ファミリ名● さらに調査するとKeyBoyの亜種EntryShellとわかる

https://www.virusbulletin.com/conference/vb2023/abstracts/unveil
ing-activities-tropic-trooper-2023-deep-analysis-xiangoop-loaderand-entryshell-payload/

MWS Cup 2023https://blog.itochuci.co.jp/entry/2023/10/06/003000

https://www.macnica.co.jp/business/security/security-reports/pdf/cyberespionage_report_2022.pdf

61

7. ファミリ名(回答チームからフィードバック)● PDBもヒントに！
○

マルウェアアナリスト4人で作問したのに抜けていた・・・😇

MWS Cup 2023

62

7. ファミリ名

The Answer is:
EntryShell or Keyboy

MWS Cup 2023

63

解答まとめ1. コマンド分岐: FUN_01230730 内で、マルウェアに実装されているコマンド数を答えよ11

2. コマンド解析1: FUN_0122db40の挙動を以下から選択せよ

システム情報の取得

3. コマンド処理2: FUN_01230730 を読み、指定したファイルを実行するコマンドに関連する処理が開始するアドレスを解答せよ

01230871

4. コマンド引数: FUN_01229310の終了時のアドレス01230781時点で01256278に格納されている文字列を答えよ/c5-1. 暗号アルゴリズム: FUN_01222260で利用されている暗号アルゴリズムを以下から選択せよ

AES-128

5-2. 暗号鍵: FUN_01222260の暗号化処理で使用される鍵を16進数で答えよ

67573746667266756e000000000000

5-3. 復号スクリプト作成: FUN_0122f250 の一連の処理を読み、FUN_01222260 の処理で以下の文字列を復号した文字列は何になるか答えよ

AES-ECB_is_the_most_basic_of_block_cipher_modes!

6-1 コンフィグ1: FUN_01223270はコンフィグを復号する関数である。この関数によって復号されるコンフィグデータの先頭8バイトを答えよ

800C06232198D06A

6-2. コンフィグ2: パスワードが保存されるグローバル変数のアドレスを答えよ

01262ad8

7. ファミリ名: これまでの分析結果から、マルウェアファミリの名称を答えよ

KeyBoy or EntryShell

MWS Cup 2023

64

ご協力お願いします● 来年度以降の継続のためにもみなさんのフィードバックが重要です！

MWS Cup 2023

65