GIAC Reverse Engineering Malware (GREM) 4日目 In-Depth Malware Analysisのメモ。
reg_exportによるレジストリ・データの抽出
Regeditによるレジストリ・データの抽出が上手く行かない場合はreg_exportを使う。以下はコマンドの例。
reg_export HKCU\Software\hoge fuga out.bin
上記のコマンドはHKCU\Software\hogeというレジストリ・パスのfugaというレジストリ値をファイルout.binに保存する。
jmp2itにシェルコードをロードしてデバッガでデバッグする
jmp2itはシェルコードを起動するためのツール。scdbgがシェルコードの実行をエミュレートするのに対してjmp2itは実際にシェルコードを実行する。jmp2itでシェルコードを実行するには実行位置のオフセットを指定する必要がある。
jmp2itにロードしたシェルコードをデバッガでデバッグするには、まずjmp2itにシェルコードをロードして一時停止させる必要がある。
以下のコマンドはオフセット0x0 (つまりコードの一番最初)でシェルコードを一時停止する。
jmp2it shellcode.bin 0x0 pause
pauseオプションは指定したオフセットの直前に無限ループの命令を挿入する。(JMP SHORT 0xFE)
ほかにpause_int3オプションがあり、このオプションは指定したオフセットの直前にINT 3 (ソフトウェア・ブレークポイント)を挿入する。
上記のコマンドでシェルコードを一時停止させたら、jmp2itのプロセスをデバッガにアタッチする。x32dbg (x64dbg)でデバッグする場合はFileメニューよりAttachを選択し、jmp2itのプロセスを選択してAttachボタンをクリックする。
その後、Debug > Run (もしくはF9キー)でデバッグを開始すると、無限ループ命令 (自身へのjmp命令)の部分で停止する。無限ループ命令をNOPするなりして解除すれば引き続きシェルコードをデバッガで解析できる。
jmp2itは管理者権限で実行することが推奨される。
VirtualAllocとVirtualAllocExについて
- VirtualAllocを呼び出すと、実行中のプロセスの中に新たにメモリ領域を確保することが出来る
- マルウェアはVirtualAllocで確保したメモリ領域にアンパックされたコードなどを書き込む事が出来る
- ほかのプロセスに対してメモリ領域を確保したい場合はVirtualAllocExを使う
- マルウェアがVirtualAllocやVirtualAllocExを呼び出している場合は、これらの関数にブレークポイントをセットして、確保されたメモリ領域にどのようなデータが書き込まれるか注視すること
ReadProcessMemoryとWriteProcessMemoryの組み合わせはインライン・フックの疑いあり
インライン・フックとはプロセスが何らかの関数を呼び出す際に正規の関数ではなく悪意のある関数へ処理を飛ばす手法のこと。フックしたい関数の先頭数バイトに悪意のある関数へのジャンプ命令を上書きすることで実現する。
以下はインライン・フックに用いられる関数。
- ReadProcessMemory
- 多くの場合、悪意のある関数へ飛ばしたあとに本来の関数へ処理を渡す必要があるため、書き換え前のバイト・コードをReadProcessMemoryによって控えておく
- WriteProcessMemory
- WriteProcessMemoryによってフックしたい関数の先頭数バイトに悪意のある関数へのJMP命令を書き込む
- あるいはJMP命令ではなくPUSH命令で悪意のある関数のアドレスをスタックに積んだ後、RET命令を呼び出して悪意のある関数へ処理を飛ばす
- VirtualProtect
- 必要に応じてVirtualProtectを使ってフックしたい関数が存在するメモリ領域を書き込み可能にする
覚えておきたいオペコード一覧
- PUSH - 0x68
- RET - 0xC3
- JMP - 0xE9, 0xEB
- 条件付きJMP - 0x70 ~ 0x7F
- NOP - 0x90
- INT3 - 0xCC
- CALL - 0xE8