Practical Malware Analysis (by Michael Sikorski and Andrew Honig) Lab18のWriteUp。
まずは自分の解答を載せて、最後に模範解答を載せる。不正解の解答も戒めとしてそのまま載せる事とする。
ラボはこちらからダウンロード可能。
Lab 18の検体は全て、これまでのラボで解析した検体をパックしたもの。それぞれの検体をアンパックして、どのラボで解析した検体か特定するのがLab 18の主題となっている。
Lab18-01.exe
アンパック前のMD5ハッシュ値 | パック形式 |
9035BED8EE6DC82B04AB1119A221974D | UPX v3.0 |
以下のUPXコマンドでアンパックしようとしたところ、エラーになってしまった。
upx -d Lab18-01.exe -o Lab18-01-unpacked.exe
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2018
UPX 3.95w Markus Oberhumer, Laszlo Molnar & John Reiser Aug 26th 2018
File size Ratio Format Name
-------------------- ------ ----------- -----------
upx: Lab18-01.exe: CantUnpackException: file is modified/hacked/protected; take
care!!!
Unpacked 0 files.
ファイルのセクションを確認したところ、通常ならばUPX0とUPX1という2つのセクションがあるべきところ、UPX2というセクションが1つあるだけだった。このことから、通常のUPXからカスタマイズされていることが分かる。

ファイルをIDAで眺めてみたところ、アドレス0x409F43にてtail jumpを見つけた。ジャンプ先は0x40154Fとなっている。
.data:00409F40 83 EC 80 sub esp, 0FFFFFF80h
.data:00409F43 E9 07 76 FF FF jmp near ptr byte_40154F
.data:00409F43 start endp ; sp-analysis failed
.data:00409F43
つまり、ファイルがアンパックされると、ジャンプ先の0x40154Fにコードが展開されることになる。
以下はコード展開前のアドレス0x40154Fの様子。

ファイルをx32dbgにロードして、アドレス0x409F43にブレークポイントをセットして実行した。

0x409F43に処理が到達したら、F8でステップオーバー実行する。するとアドレス0x40154Fにジャンプし、コードが展開されているのが確認できた。

あとはメモリにアンパックされたコードをダンプしてファイルに保存する。手順はこちらの記事のプロセスをダンプした後にインポート・テーブルを修正するの項を参照。
ダンプしたファイルを調べた結果、Lab18-01.exeはLab14-01.exeをパックしたものであることが判明した。
Lab18-02.exe
アンパック前のMD5ハッシュ値 | パック形式 |
9C5C27494C28ED0B14853B346B113145 | FSG |
ファイルをIDAにロードしてジャンプ命令を片っ端から検索したところ、以下のtail jumpを発見した。
00000000004050E1 0F 84 A9 BF FF FF jz near ptr dword_401090 ; tail jump?
上記より、アンパックされたコードはアドレス0x401090に展開されるものと思われる。
以下はコード展開前のアドレス0x401090の様子。

ファイルをx32dbgにロードしてtail jumpを呼び出している0x4050E1とジャンプ先の0x401090にブレークポイントをセットしてF9実行した。

F9を数回実行するとアドレス0x401090付近にコードが展開された。

メモリにアンパックされたコードをダンプしてファイルに保存して解析した結果、Lab18-02.exeはLab07-02.exeをパックしたものであることが判明した。
Lab18-03.exe
アンパック前のMD5ハッシュ値 | パック形式 |
68EAAA29813D706F4024AF83CF3B88DC | PECompact v1.4x+ |
セオリー通りならPECompactでパックされたファイルのOEP (Original Entry Point)はjmp eax
命令によるtail jumpを探せば見つかるのだが、そのjmp eax
命令が見つからなかった。
ファイルをx32dbgにロードして一回だけF9実行し、画面下方へスクロールしていくとアドレス0x405678にて以下のジャンプ命令を見つけた。

以下はジャンプ先の0x40754Eの様子。

試しに0x405678にブレークポイントをセットし、0x40754Eへジャンプ後に数回ステップオーバー実行したところ、ret命令の直後にアドレス0x401577付近に以下の関数のプロローグと思われるコードが展開された。

アドレス0x401577をOEPに指定してメモリに展開されたコードをダンプして解析した結果、Lab18-03.exeはLab09-02.exeをパックしたものであることが判明した。
Lab18-04.exe
アンパック前のMD5ハッシュ値 | パック形式 |
1F92CB5516616E8DB3777E7A0458F3D1 | ASPack v2.12 |
ASPackでパックされたファイルをアンパックするには以下のようにする。(こちらのサイトの手順を参考にした。)
まず、ファイルをx32dbgにロードし、一度だけF9実行する。するとpushad命令に到達する。ブレークポイントがpushadに到達したら、一度だけステップオーバー (F8) 実行して、スタックのアドレス (ESPの値) を確認する。


上記より、スタックのアドレスは0x18FF6Cであることが確認できた。
続いて、アドレス0x18FF6Cにハードウェア・ブレークポイントをセットする。x32dbgの画面右下のスタック画面からアドレス0x18FF6Cを選択して右クリックし、Breakpoint -> Hardware,Access -> Dwordを選択してハードウェア・ブレークポイントをセットする。(Dwordを選んだのは解析対象のファイルが32ビット・プログラムのため。)

ハードウェア・ブレークポイントのセットが完了したら、一度だけF9実行する。pushad命令に対応するpopad命令が呼び出されるとスタック・アドレスにセットしたブレークポイントが起動し、以下のコードがメモリに展開された。

上記のコードを眺めてみると、push命令で0x403896をスタックに積んだ直後にret命令を呼び出している。この一連の命令はアドレス0x403896へのジャンプ命令と同義である。(push命令でジャンプ先のアドレス0x403896をスタックに積んで、直後のret命令でアドレス0x403896をスタックから取り出してジャンプする。)
数回ステップオーバー実行したところ、アドレス0x403896付近に関数のプロローグと思われるコードが展開されているのが確認できた。

アドレス0x403896をOEPに指定してメモリに展開されたコードをダンプして解析した結果、Lab18-04.exeはLab09-01.exeをパックしたものであることが判明した。
Lab18_05.exe
アンパック前のMD5ハッシュ値 | パック形式 |
6ECDC18C99934B6185088A07319EEEC9 | WinUpack 0.39 |
x32dbgにファイルをロードし、決め打ちでGetCommandLineAにブレークポイントをセットした。
SetBPX GetCommandLineA
ファイルをF9実行すると、GetCommandLineAへのジャンプ命令でブレークポイントが起動した。

ここから、DebugメニューよりRun to user codeを選んで実行する。
するとGetCommandLineAのcall直後にブレークポイントが起動した。

上記のGetCommandLineAのcall部分から画面上方へスクロールしていくと、アドレス0x401190付近に関数のプロローグと思われるコードを発見した。

アドレス0x401190をOEPに指定してメモリに展開されたコードをダンプして解析した結果、Lab18_05.exeはLab07-01.exeをパックしたものであることが判明した。
模範解答
全ての検体をアンパックしてオリジナルの検体を特定できたため、今回は省略。