FLARE スクリプト シリーズ:flare-dbg プラグイン

flare-dbg plug-in summary news

序章

この投稿は、FireEye Labs Advanced Reverse Engineering (FLARE) スクリプト シリーズの続きです。この投稿では、flare-dbg プロジェクトについて引き続き説明します。 Flare-dbg を使用した文字列デコードの自動化に関する私の最初の投稿をまだ読んでいない場合は、必ずチェックしてください。

WinDbg のプラグインの作成をサポートするために、flare-dbg Python プロジェクトを作成しました。マルウェアの分析中に WinDbg の機能を利用すると、実行可能ファイルの実行時の動作に関する洞察が得られます。 Flare-dbg を使用すると、このプロセスが特に簡単になります。このブログ投稿では、他のデバッガーや分析ツールの機能に触発された WinDbg プラグインについて説明します。プラグインは、ランタイム情報の収集と、実行中のマルウェアとの対話に重点を置いています。本日は、表 1 にまとめた 3 つの Flare-dbg プラグインを紹介します。

flare-dbg plug-in summary
表 1: Flare-dbg プラグインの概要

これらのプラグインの機能を示すために、この投稿では、TINBA to FireEye として知られるバンキング型トロイの木馬 (MD5: 03BA3D3CEAE5F11817974C7E4BE05BDE) を使用しています。

注入する

バックグラウンド

マルウェアが使用する一般的な手法は、コード インジェクションです。マルウェアがメモリ領域を割り当ててコードを挿入すると、作成された領域には、プロセスのメモリ空間でそれらを識別するために使用する特定の特性が含まれます。 injectfind プラグインは、挿入されたメモリ領域に関する情報を WinDbg 内から検索して表示します。

injectfind プラグインは、大まかに Volatility malfind プラグインに基づいています。メモリ ダンプが与えられると、Volatility バリアントは挿入されたコードのメモリを検索し、アナリストがプロセス内で見つかった挿入されたコードを表示します。メモリ ダンプを要求する代わりに、injectfind WinDbg プラグインがデバッガーで実行されます。 malfind と同様に、injectfind プラグインは、コードが挿入された可能性のあるメモリ領域を識別し、識別された各メモリ領域の 16 進ダンプと逆アセンブリ リストを出力します。出力を一目見ただけで、挿入されたコードやフックされた関数を特定できます。次のセクションでは、アナリストが注入されたコードを injectfind で特定する例を示します。

分析環境で TINBA マルウェアを実行した後、初期ローダー プロセスがすぐに終了し、explorer.exe プロセスが一見ランダムなドメインに対してネットワーク リクエストを開始することが観察されました。 Windbg を使用して explorer.exe プロセスにアタッチし、injectfind プラグインを実行すると、図 1 に示す出力が表示されます。

injectfind プラグインからの出力
図 1: injectfind プラグインからの出力

仮想アドレス 0x1700000 の最初のメモリ領域には、Windows ライブラリ関数への参照が含まれているようで、サイズは 0x17000 バイトです。このメモリ領域には、TINBA マルウェアの主要なペイロードが含まれている可能性があります。

仮想アドレス 0x1CD0000 の 2 番目のメモリ領域には、長さが 0x1000 バイトの 1 ページが含まれており、2 行の意味のある逆アセンブリがあるように見えます。逆アセンブリは、eax レジスタが 0x30 に設定され、5 バイトが NtCreateProcessEx 関数にジャンプすることを示しています。図 2 は、NtCreateProcessEx 関数の最初のいくつかの命令の逆アセンブリを示しています。

NtCreateProcessEx 逆アセンブル リスト
図 2: NtCreateProcessEx 逆アセンブリ リスト

NtCreateProcessEx の最初の命令は、ntdll のメモリ外のアドレスへの jmp です。宛先アドレスは、挿入されたコードとして識別された最初のメモリ領域内にあります。このマルウェアは、すべて Windbg デバッガー セッション内からプロセスを作成するための関数フックを作成しているとすぐに結論付けることができます。

メンバーブレイク

バックグラウンド

OllyDbgx64dbgに存在する Windbg に欠けている機能の 1 つは、メモリ領域全体にブレークポイントを設定する機能です。このタイプのブレークポイントは、メモリ ブレークポイントと呼ばれます。メモリ ブレークポイントは、指定されたメモリ領域が実行されたときにプロセスを一時停止するために使用されます。

メモリ ブレークポイントは、単一のアドレスを指定せずにコードの実行を中断する場合に便利です。たとえば、多くのパッカーはコードを新しいメモリ領域にアンパックし、この新しいメモリのどこかで実行を開始します。新しいメモリ領域にメモリ ブレークポイントを設定すると、新しいメモリ領域内の最初の実行時にデバッガが一時停止します。これにより、元のエントリ ポイントを特定するためにアンパック スタブをリバース エンジニアリングする手間が省けます。

メモリ ブレークポイントを実装する 1 つの方法は、PAGE_GUARD メモリ保護フラグを追加して、メモリ領域のメモリ保護を変更することです。このメモリ領域が実行されると、STATUS_GUARD_PAGE_VIOLATION 例外が発生します。デバッガーは例外を処理し、制御をユーザーに返します。 Flare-dbg プラグインの membreak は、この手法を使用してメモリ ブレークポイントを実装します。

injectfind プラグインを使用して挿入されたコードを見つけた後、メモリ ブレークポイントを設定して、挿入されたコードのメモリ領域内で実行を一時停止します。 membreak プラグインは、パラメーターとして 1 つまたは複数のアドレスを受け入れます。プラグインは各アドレスを取得し、対応するメモリ領域のベース アドレスを見つけて、領域全体のアクセス許可を変更します。図 3 に示すように、挿入されたコードのベース アドレスをパラメーターとして membreak プラグインを実行すると、デバッガーはこれらのメモリ領域のいずれかが実行されるまですぐに実行を開始します。

Windbg で実行される membreak プラグイン
図 3: Windbg で実行される membreak プラグイン

メモリ ブレークポイント ヒットの出力には、ガード ページ違反と、初回例外に関するメッセージが表示されます。上で説明したように、これは予想されるはずです。ブレークポイントに達すると、membreak プラグインは元のページのアクセス許可を復元し、制御をアナリストに返します。

インポート検索

バックグラウンド

マルウェアは多くの場合、実行時に Windows ライブラリ関数を読み込み、解決されたアドレスをグローバル変数として保存します。これらを IDA Pro で静的に解決するのは簡単な場合もありますが、面倒なプロセスになる場合もあります。これらのランタイムにインポートされた関数のラベル付けを高速化するために、これらの関数のアドレスを見つけるための importfind という名前のプラグインを作成しました。バックグラウンドで、プラグインは各ライブラリのエクスポート テーブルを解析し、エクスポートされたすべての関数アドレスを見つけます。その後、プラグインはマルウェアのメモリを検索し、ライブラリ関数アドレスへの参照を識別します。最後に、解決されたライブラリ関数名で IDB ワークスペースに注釈を付けるために使用できる IDAPython スクリプトを生成します。

TINBA に戻ると、上記の injectfind からの出力に、Windows ライブラリ関数を参照するテキストが表示されました。図 2 の IDA Pro のスクリーンショットは、この同じ領域のデータを示しています。 API 名を含む各 ASCII 文字列の後に、ポインタのような数字があることに注意してください。残念ながら、IDA Pro にはデバッガーと同じ洞察がないため、これらのアドレスは API 関数に解決されず、名前が付けられません。

名前のないライブラリ関数のアドレス
図 4: 名前のないライブラリ関数のアドレス

図 5 に示すように、importfind プラグインを使用して、これらのアドレスに関連付けられた関数名を検索します。

Windbg で実行される importfind プラグイン
図 5: Windbg で実行される importfind プラグイン

importfind プラグインは、図 2 に示すように、IDB 内のこれらのグローバル変数の名前を変更するために使用される IDA Python スクリプト ファイルを生成します。図 6 は、スクリプトがグローバル変数の名前をより意味のある名前に変更した後の IDA Pro のスクリーンショットを示しています。

名前付きグローバル変数を使用した IDA Pro
図 6: 名前付きグローバル変数を使用した IDA Pro
結論

このブログ投稿では、flare-dbg プラグインをデバッガーで使用して、マルウェアが実行時にどのように動作するかについて洞察を得ることができることを示しています。 injectfind プラグインを使用して挿入されたコードを識別し、membreak を使用してメモリ ブレークポイントを作成する方法を見てきました。また、実行時にインポートされた関数を識別して名前を変更するための importfind プラグインの有用性も示しました。

Flare-dbg をセットアップして開始する方法を確認するには、 github プロジェクト ページにアクセスしてください。 セットアップと使用方法について学びます。

 

参照: https://www.mandiant.com/resources/blog/flare-script-series-flare-dbg-plug-ins

Comments

タイトルとURLをコピーしました