FIDL: FLARE の IDA デコンパイラ ライブラリ

IDA Pro と Hex Rays デコンパイラは、リバース エンジニアリングと脆弱性研究のためのツールキットの中核部分です。以前のブログ記事で、Hex-Rays API を使用して、マルウェア分析の一部として一般的に見られる、明確に定義された小さな問題を解決する方法について説明しました。バイナリ コードのより高いレベルの表現にアクセスできるため、Hex-Rays デコンパイラはリバース エンジニアリングのための強力なツールになります。ただし、HexRays API とその基盤となるデータ ソースを操作するのは困難な場合があり、一般的な分析スクリプトの作成が困難または退屈になります。

このブログ投稿では、Hex-Rays API のラッパー レイヤーを提供する FireEye のオープン ソース ライブラリであるFLARE IDA Decompiler Library (FIDL)を紹介します。

バックグラウンド

Hex-Rays 逆コンパイラからの出力は、Abstract Syntax Tree (AST) を介してアナリストに公開されます。そのままで、Hex-Rays API を使用してバイナリを処理することは、ツリー内の各ノードを訪問してコールバックを発行するツリー ビジター クラスを使用して、この AST を反復することを意味します。コールバックごとに、アクセスしているノードの種類 (呼び出し、追加、割り当てなど) を確認してから、そのノードを処理できます。これらの構造の詳細については、以前のブログ投稿を参照してください。

問題

このワークフローは強力ですが、いくつかの理由により、汎用 API を作成するときに使用するのが難しい場合があります。

  • ノードが訪問される順序は、逆コンパイラの出力に基づいて常に明らかであるとは限りません
  • ノードにアクセスするとき、AST 内のどこにいるかについてのコンテキストはありません
  • 複数のステップを必要とする問題には、コールバック関数で複数の訪問者または複雑なロジックが必要です
  • AST を上下に移動するときに処理するケースの量が指数関数的に増加する可能性があります

これらの各ケースを 1 つのビジター コールバック関数で処理することはできないため、逆コンパイラとより柔軟に対話する方法が必要です。

FIDL

FLARE IDA Decompiler Libraryである FIDL は、Hex-Rays API のラッパーの実装です。 FIDL の主な目標は、デフォルトの逆コンパイラ API の下位レベルの詳細を抽象化することです。 FIDL は複数の問題を解決します。

  • より複雑なバイナリ処理スクリプトの作成に使用できる、わかりやすい API レイヤーをアナリストに提供します
  • AST 処理の詳細を抽象化する
  • 逆コンパイラを使用するときに一般的に必要な機能のヘルパー実装を提供します
  • さまざまな Hex-Rays API の使用方法に関する文書化された例を提供します

FIDL の利点の多くは、controlFlowinator クラスを介してユーザーに公開されます。このオブジェクトを構築するとき、FIDL は AST を解析し、呼び出された API、それらのパラメーター、および関数のローカル変数とパラメーターの要約を含む逆コンパイラーを介して抽出された情報を使用して、関数の概要を提供します。

図 1 は、関数の逆コンパイルの横にある controlFlowinator を介して利用可能な情報のサブセットを示しています。

Sample output available as part of a controlFlowinator
図 1: controlFlowinator の一部として利用可能なサンプル出力

構築中に AST を解析するとき、controlFlowinator は同じ論理式を表すノードも組み合わせて、各ブロックが大まかに 1 行の擬似コードに変換される、より消化しやすい形式にします。図 2 と図 3 は、同じ関数の AST と controlFlowinator 表現を示しています。

関数の AST のデフォルトのレンダリング
図 2: 関数の AST のデフォルトのレンダリング
図 2 に示す関数の controlFlowinator によって作成された制御フロー グラフ
図 3: 図 2 に示す関数の controlFlowinator によって作成された制御フロー グラフ

デフォルトの AST と比較すると、このグラフは、関数を介して取得できる潜在的なコード パスによって編成されています。これにより、アナリストは、特定の式のコンテキストを判断しようとするときに、反復するより論理的な構造を得ることができます。

関数で使用される変数や API 呼び出しに簡単にアクセスできるため、Hex-Rays API を利用するスクリプトの作成がはるかに簡単になります。以前のブログ投稿で、HexRays API を使用して、パラメーターに基づいてグローバル変数の名前を GetProcAddress に変更するスクリプトを紹介しました。図 4 は、FIDL API を使用して書き直されたこのスクリプトを示しています。この新しいスクリプトは理解しやすく、AST を手動で実行する必要がありません。

FIDL API を使用して GetProcAddress へのすべての呼び出しをグローバル変数にマップするスクリプト
図 4: FIDL API を使用して GetProcAddress へのすべての呼び出しをグローバル変数にマップするスクリプト

一般に、GetProcAddress マルウェアを呼び出すのではなく、Export Address Table (EAT) を調べ、事前に計算された値を探して DLL のエクスポートのハッシュを比較することで、必要なインポートを手動で展開します。アナリストは、これらの関数を目的の API にすばやくまたは自動的にマップできるため、分析に時間をかける必要がある関数を簡単に特定できます。図 5 は、FIDL を使用してこれらのケースを処理する方法の例を示しています。このスクリプトは、MD5 ハッシュ 7B82CF2CF9D08191C6828C3F62A2F914 を持つ DRIDEX サンプルを対象としています。このバイナリは、インポート解決時のハッシュ アルゴリズムとして、0x65C54023 の XOR キーを持つ CRC32 を使用します。

DRIDEX サンプルを自動的に処理およびマークアップする IDAPython スクリプト
図 5: DRIDEX サンプルを自動的に処理してマークアップする IDAPython スクリプト

上記のスクリプトを実行すると、図 6 に示すような出力が得られます。コメントには、解決された関数のラベルが付けられています。

図 5 のスクリプトは、復号化された文字列に注釈を付けて、逆コンパイラの出力にコメントを挿入します。
図 6: 図 5 のスクリプトは、復号化された文字列に注釈を付けて、逆コンパイラの出力にコメントを挿入します

FIDL は、FireEye GitHub リポジトリ にあります

結論

Hex-Rays デコンパイラーはリバース エンジニアリング中の強力な情報源ですが、既定の API を使用して汎用スクリプトとプラグインを作成することは難しく、多数のエッジ ケースを処理する必要があります。この投稿では、Hex-Rays API のラッパーであるFIDL ライブラリを紹介しました。これは、アナリストが逆コンパイラを利用するスクリプトを作成するために理解する必要がある低レベルの詳細の量を減らすことでこれを修正し、これらのスクリプトの作成を行う必要があります。はるかに高速。今後のブログ投稿では、このライブラリを利用したスクリプトと分析をさらに公開する予定です。

参照: https://www.mandiant.com/resources/blog/fidl-flares-ida-decompiler-library

コメント

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