FLARE IDA Pro Script シリーズ: IDAPython を使用した FLAIR 関数パターンの生成

ida-pro1 news

FireEye Labs Advanced Reverse Engineering (FLARE) チームは、知識とツールをコミュニティと共有し続けています。これは、このブログでリリースした 3 番目の IDA Pro スクリプトであり、引き続きこれらのスクリプトをここでリリースします。

概要

このブログでは、マルウェアのリバース エンジニアリングを支援する IDAPython スクリプトについて説明します。 FLIRT シグネチャは、IDA Pro がコンパイル済みプログラムの共通関数を認識し、リバース エンジニア用にそれらの名前を自動的に変更するのに役立ちます。 IDAPython スクリプト idb2pat.py は、既存の IDB ファイルから IDA Pro FLAIR パターンを生成します。元のソースまたは静的ライブラリの一般的な要件がない場合でも、IDA Pro にロードされた 32 ビットまたは 64 ビットの実行可能ファイルの FLIRT 署名を生成するために使用できます。 idb2pat.py は Python で記述されているため、IDA Pro SDK がリリースされるたびに再コンパイルする必要はありません。

問題

IDA Pro は、FLIRT (Fast Library Identification and Recognition Technology) シグネチャを使用して、プログラム内でコンパイラによって生成され、静的にリンクされた関数をすばやく識別します。識別されると、IDA Pro は共通関数の名前を変更し、これらをライブラリ関数としてマークして、リバース エンジニアをコードのより関連性の高いセクションに誘導します。たとえば、FLIRT シグネチャがない場合、リバース エンジニアは図 1 に示す複雑な機能に遭遇し、その目的を理解するために作業する可能性があります。 FLIRT 署名を有効にすると、IDA Pro は関数の名前を printf に変更するため、アナリストはおそらくそれを無視できます。

ida-pro1

Hex-Rays は、Fast Library Acquisition for Identification and Recognition (FLAIR、FireEye FLARE チームとは関係ありません 🙂 ) パッケージでユーティリティを配布し、Web サイトでカスタム FLIRT 署名を生成します。これらのユーティリティは、Linux の .a ファイルや Windows の .lib ファイルなどの静的ライブラリで動作します。リバース エンジニアは、FLAIR ユーティリティを使用してカスタム ライブラリを識別するように IDA Pro に簡単に教えることができます。通常、リバース エンジニアはまず、pelf などのユーティリティを使用して、ライブラリ内の各関数の主要な機能を記述したパターン ファイルを生成します。次に、sigmake ユーティリティを使用して、テキスト パターン ファイルをバイナリ署名ファイルに変換します。この 2 番目の手順により、署名の競合が解決され、IDA Pro が消化できる効率的な形式が生成されます。リバース エンジニアは、シグネチャ ファイルをロードし、静的にリンクされたプログラムのカスタム ライブラリ関数の名前を変更するよう IDA Pro に指示できるようになりました。

たとえば、 FLARE-On チャレンジ中に、成功した参加者の一部は、カスタム FLIRT 署名を使用して 6 番目のチャレンジ (linhax) を完了しました。静的にリンクされた Linux 実行可能ファイルが取り除かれたため、多くの一般的な機能が主要な機能と混在しているように見えました。一致するランタイム ライブラリで FLAIR ユーティリティを使用すると、linhax のサポート関数名の多くを解決するために必要な FLIRT 署名が作成されました。

残念ながら、FLAIR ユーティリティは静的ライブラリでしか動作しないため、リンクする前にリバース エンジニアがソース コードまたはライブラリにアクセスできる場合に最も役立ちます。通常はこれで問題ありません。ただし、いくつかの特殊なケースがあります。たとえば、Go バイナリは常に Go 言語の依存関係に静的にリンクされており、これらのライブラリを個別にビルドすることはできません。ストリップされた「Hello, World!」をロードしたとき。 IDA Pro にプログラムすると、1,777 個の名前のない関数に遭遇しました。これらの関数の大部分の名前を自動的に変更できれば、多くの時間を節約できます。

既存のソリューション

10 年以上にわたり、IDA Pro にロードされたプログラムから署名を抽出する IDA プラグインは、オンラインで無料で入手できます。特に、idb2pat と idb2sig は、 ここからダウンロードできる共有ライブラリ プラグインです。図 2 は、IDA Pro で idb2sig を使用して ntdll.dll からパターン ファイルを生成するリバース エンジニアを示しています。これらのプラグインは高速で、十分にテストされています。ただし、これらは C++ で記述されているため、IDA Pro SDK を更新するたびに再コンパイルする必要があります。また、多くのプラグインでは 64 ビット プログラムのサポートが制限されています。

ida-pro2

提案された解決策

IDAPython スクリプト idb2pat.py は、IDB ファイルから FLAIR パターンを生成します。 32 ビット プログラムと 64 ビット プログラムの両方で動作します。これは、C++ idb2sig (mercury によって、TQN によって更新された) の Python への非常に近いポートです。

インストールと使用

スクリプト idb2pat.py は Apache ライセンス バージョン 2.0 に基づいて提供されており、FLARE チームの Github リポジトリからダウンロードできます。ダウンロードしたら、IDA Pro のスクリプト ダイアログを使用してスタンドアロン スクリプトを直接実行できます。スクリプトは、出力ファイル パスの入力を求め、現在のプロジェクトの各関数のパターンを生成する際に適切な既定値を使用します。これらのデフォルトは微調整でき、十分なドキュメントがプラグイン ファイルにあります。

Goのバイナリをリバースエンジニアリングする方法を考えているうちに、idb2pat.pyを開発したくなりました。例として、「Hello, World!」をコンパイルしました。 64 ビット Linux 用のサンプル プログラムは、Go チュートリアルの Web サイト (こちら) で入手できます。 Go コンパイラには、デフォルトの実行可能形式に豊富なデバッグ情報とシンボルが含まれており、IDA Pro の分析により、バイナリ ファイル内の 1,777 個の関数すべての名前が変更されました。しかし、ファイルを削除した後、IDA Pro は関数の名前を変更できず、メイン関数の逆アセンブリからサポート コードを区別するのに苦労しました。図 3 と図 4 は、Go バイナリを削除する前と後の関数のリストを示しています。

ida-pro3

ida-pro4

IDA Pro がサポート関数を識別しやすくするために、idb2pat.py を使用して、ストリップされていないバイナリからパターン ファイルを生成しました。図 5 は、スクリプトが 1,754 のパターンを生成したときのプラグインの出力を示しています。次に、FLAIR ユーティリティの sigmake を実行して、ファイル内の 18 のパターン競合を特定し、データベースからそれらを削除しました。これにより、同じく sigmake を使用して署名ファイルに変換した 1,718 のパターンが得られました。次のコマンドを使用して、パターン ファイルに対して sigmake を呼び出しました。

sigmake -ngolang-linux64 helloworld.pat helloworld.sig

ida-pro5

次に、プログラムの削除されたバージョンを開き、FLIRT 署名を適用し、IDA Pro がほとんどの関数の名前を変更するのを見ました。見逃されたいくつかの関数は、18 のパターンの競合、または命令が 6 バイト未満の関数 (効果的に署名するには短すぎる) のいずれかが原因でした。図 6 は、名前が認識されない場合の初期化ルーチンの基本ブロックを示しています。図 7 は、FLIRT 署名が適用された後の同じブロックを示しています。 2 番目のビューでは、関数名を介してより多くのコンテキスト情報が表示されます。

東プロ6

ida-pro7

Go チュートリアル シリーズの他のプログラムにも同じ署名を適用すると、サポート機能とライブラリ機能の多くが同じであるため、適切なカバレッジが得られました。すべての標準ライブラリをインポートする Go プログラムを開発し、これを Go の包括的な FLIRT シグネチャのソースとして使用する予定です。

結論

IDAPython スクリプト idb2pat.py を使用して、IDA Pro FLIRT シグネチャの関数パターンをすばやく簡単に生成できます。これにより、IDA はコンパイル済みプログラムの一般的な関数の名前を自動的に変更できます。このスクリプトは 32 ビット プログラムと 64 ビット プログラムの両方で動作し、Python で記述されているため、ユーザーが簡単に更新および変更できます。 FLARE チームの Github リポジトリからダウンロードして、この無料ツールを試してみてください。

参考: https ://www.mandiant.com/resources/blog/flare-ida-pro-script

Comments

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