PracticalMalwareAnalysis-Labs18 WriteUp

Practical Malware Analysis (by Michael Sikorski and Andrew Honig) Lab18のWriteUp。
まずは自分の解答を載せて、最後に模範解答を載せる。不正解の解答も戒めとしてそのまま載せる事とする。
ラボはこちらからダウンロード可能。

Lab 18の検体は全て、これまでのラボで解析した検体をパックしたもの。それぞれの検体をアンパックして、どのラボで解析した検体か特定するのがLab 18の主題となっている。

Lab18-01.exe

アンパック前のMD5ハッシュ値パック形式
9035BED8EE6DC82B04AB1119A221974DUPX 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ハッシュ値パック形式
9C5C27494C28ED0B14853B346B113145FSG

ファイルを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ハッシュ値パック形式
68EAAA29813D706F4024AF83CF3B88DCPECompact 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ハッシュ値パック形式
1F92CB5516616E8DB3777E7A0458F3D1ASPack 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ハッシュ値パック形式
6ECDC18C99934B6185088A07319EEEC9WinUpack 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をパックしたものであることが判明した。

模範解答

全ての検体をアンパックしてオリジナルの検体を特定できたため、今回は省略。

Leave a Reply

Your email address will not be published.