FLARE スクリプト シリーズ: エミュレーションと鉄のストリングを使用したスタック ストリングのリカバリ

Disassembly listing showing stackstring creation and usage news

このブログ投稿は、FireEye Labs Advanced Reverse Engineering (FLARE) チームがマルウェア分析コミュニティを支援するツールを共有するスクリプト シリーズの続きです。本日、 ironstringsをリリースしました。これは、マルウェアからスタックストリングを回復するための新しい IDAPython スクリプトです。このスクリプトは、コード エミュレーションを利用して、この一般的な文字列の難読化手法を克服します。より正確には、IDA Pro と Unicorn エミュレーション エンジンを組み合わせたフレア エミューツールを使用します。このブログ投稿では、新しいスクリプトが Flare -emuを使用してマルウェアからスタックストリングを回復する方法について説明します。さらに、 flare-emuのイベント フックと、それらを使用してツールを独自の分析ニーズに簡単に適合させる方法についても説明します。

序章

バイナリ ファイル内の文字列の分析は、マルウェア分析の重要な部分です。このリバース エンジニアリング手法は単純ですが、プログラムの使用法とその機能に関する貴重な情報を提供できます。これには、ファイル パスやドメイン名などの侵害の痕跡が含まれます。特に高度な分析では、逆アセンブルされたプログラムの機能を理解するために文字列が不可欠です。マルウェアの作成者はこれを知っており、文字列の難読化は、リバース エンジニアが遭遇する最も一般的な分析防止手法の 1 つです。

難読化された文字列が蔓延しているため、FLARE チームは、難読化された文字列に対処するためのさまざまなツールと手法をすでに開発し、共有しています。 2014 年に、マルウェアで構築された文字列の復元を自動化する IDA Pro プラグインを公開しました。 2016 年にはFLOSSをリリースしました。マルウェア内の文字列を自動的に識別してデコードするスタンドアロンのオープンソース ツールです

どちらのソリューションも、Python ベースのプログラム分析およびエミュレーション フレームワークであるvivisectに依存しています。 vivisect は堅牢なツールですが、実行可能ファイルを完全に分析したり、そのコードを正しくエミュレートしたりできない場合があります。また、他のツールと同様に、vivisect はアンチ分析技術の影響を受けやすいです。 vivisect による処理が欠落、不完全、または誤っていると、依存ツールは最良の結果を提供できません。さらに、vivisect は、プログラム分析をインタラクティブに変更および強化するための使いやすいグラフィカル インターフェイスを提供しません。

最近、GandCrab ランサムウェアのサンプル (バージョン 5.0.4、SHA256 ハッシュ: 72CB1061A10353051DA6241343A7479F73CB81044019EC9A9DB72C41D3B3A2C7) を分析したときに、これらすべての欠点に遭遇しました。このマルウェアには、逆アセンブルと制御フロー分析を妨げるさまざまな分析防止技術が含まれています。 IDA Pro で効率的なリバース エンジニアリングを実行するには、これらのハードルを克服する必要がありました。 IDAPython を使用してさまざまな分析防止命令パターンを削除し、逆アセンブラーがバイナリ内のすべての関数を正常に識別できるようにしました。復元された関数の多くには、難読化された文字列が含まれていました。残念ながら、元のバイナリに対して独自の独立した分析を実行するため、私の変更は vivisect に反映されませんでした。その結果、vivisect は依然としてほとんどの機能を正しく認識できず、難読化された文字列を復元するために既存のソリューションを使用することはできませんでした。

IDA Pro のパッチを vivisect にフィードバックしたり、修正したバイナリを作成したりすることもできましたが、代わりに、vivisect に依存しない新しい IDAPython スクリプトを作成しました。したがって、前述の欠点を回避します。 IDA Pro のプログラム解析と Unicorn のエミュレーション エンジンを使用します。これら 2 つのツールを簡単に統合するには、 flare-emuを使用します。

vivisect の代わりに IDA Pro を使用すると、以前の実装の複数の制限が解決されます。ユーザーが IDB ファイルに加えた変更 (手動で分析を強化するためのパッチ命令など) は、エミュレーション中にすぐに利用できるようになりました。さらに、このツールは、x86、AMD64、ARM などのさまざまなアーキテクチャをより確実にサポートします。

スタックストリング: 例

図 1 の逆アセンブリ リストは、私が分析したサンプルの文字列の難読化の例を示しています。マルウェアは、実行時に各文字を隣接するスタック アドレスに移動して文字列を作成します (灰色のハイライト)。最後に、サンプルは文字列の開始オフセットを引数として InternetOpen API 呼び出しに渡します (青色の強調表示)。これらのメモリの移動を手動で追跡し、文字列を手動で復元するのは、非常に面倒なプロセスです。特に、マルウェアが以下に示すような追加の指示を使用して値の割り当てを複雑にする場合.

Disassembly listing showing stackstring creation and usage
スタックストリングの作成と使用法を示す逆アセンブル リスト

マルウェアはスタック メモリを使用してこのような文字列を作成することが多いため、Jay Smith は、この分析防止手法に対してスタック文字列という用語を作り出しました。マルウェアは、グローバル メモリ内に文字列を作成することもできることに注意してください。新しいスクリプトは両方のケースを処理します。スタック上およびグローバル メモリ内に構築された文字列。

ironstrings: Flare-emu を使用したスタックストリングのリカバリー

新しい IDAPython スクリプトは、既存のソリューションを進化させたものです。 FLOSS のスタックストリング回復アルゴリズムと IDA Pro プラグインの機能を組み合わせたものです。このスクリプトは、IDA Pro のプログラム分析に依存し、Unicorn を使用してコードをエミュレートします。両方のツールの組み合わせは、 flare-emuによって強化されます。 Feは、 flare-emu の略で、鉄の化学記号であるため、スクリプトはironstringsと名付けられています。

スタックストリングを回復するために、 ironstringsは、IDA Pro によって識別されるライブラリとサンク関数を除く、プログラム内のすべての逆アセンブルされた関数を列挙します。関数ごとに、スクリプトは関数を介してさまざまなコード パスをエミュレートし、次の 2 つのヒューリスティックに基づいてスタック文字列を検索します。

  1. 関数内のすべての呼び出し命令の前。スタック文字列はしばしば構築されてから、他の関数、つまりCreateFileInternetOpenUrlなどの Windows API に渡されます。
  2. 5 つを超えるメモリ書き込みを含む基本ブロックの最後。メモリ書き込みの数は構成可能です。このヒューリスティックは、関数内で同じメモリ バッファーが複数回使用されている場合や、文字列の構築が複数の基本ブロックにまたがっている場合に役立ちます。

これらの条件のいずれかに該当する場合、スクリプトは関数の現在のスタック フレームを検索して、印刷可能な ASCII および UTF-16 文字列を探します。グローバル メモリ内の文字列を検出するために、スクリプトはさらに、書き込まれたすべてのメモリ位置で文字列を検索します。

Flare-emu フックを使用して Stackstring を回復する

まだFlare-emuに慣れていない場合は、 以前のブログ投稿を読むことをお勧めします。ツールが提供するいくつかのインターフェイスについて説明します。その他の役立つリソースは、 flare-emu GitHubで入手できるサンプルとプロジェクト ドキュメントです。

stackstrings スクリプトは、 flare-emuiterateAllPaths API を使用します。関数は、関数を介して複数のコード パスを反復します。最初に、関数の開始から関数の終了までの可能なパスを見つけます。その後、ツールは、実際のプログラムの状態とは関係なく、識別されたすべてのコード パスをエミュレーションに強制します。この広範なコード カバレッジにより、アイアンストリングは、さまざまなエミュレーションの実行から構築された文字列を回復できます。

Flare-emuの重要な機能は、さまざまなエミュレーション イベントによってトリガーされるさまざまなフック関数です。これらのフックまたはコールバックにより、非常に強力な自動化タスクの開発が可能になります。使用可能なフックは、メモリ アクセス イベントをフックするなどの Unicorn の標準フックと、 flare-emuによって提供される複数の便利なフックの組み合わせです。次のセクションでは、 flare-emuで利用可能なコールバックについて簡単に説明し、 ironstringsスクリプトがそれらを使用して難読化された文字列を復元する方法を示します。

  • instructionHook: この Unicorn 標準フックは、命令がエミュレートされる前にトリガーされます。たとえば、基本ブロックに十分なメモリ書き込みが含まれている場合、 ironstringsはこのフックを使用してスタックストリングの抽出を開始します。
  • memAccessHook: この Unicorn 標準フックは、エミュレーション中にメモリの読み取りまたは書き込みイベントが発生したときにトリガーされます。 stackstrings スクリプトでは、この関数はすべてのメモリ書き込みに関するデータを保存します。
  • callHook: この Flare -emuフックは、各関数呼び出しの前にアクティブ化されます。フックの戻り値は無視されます。スタックストリング スクリプトでは、このフックがスタックストリングの抽出をトリガーします。
  • preEmuCallback: この Flare Emu フックは、各エミュレーションの実行前に呼び出されます。 iterate および iterateAllPaths 関数でのみ使用できます。フックの戻り値は無視されます。 ironstringsはこのフックを使用しません。
  • targetCallback: この Flare -emuフックは、指定されたターゲット アドレスのいずれかにヒットするたびに呼び出されます。 iterate および iterateAllPaths 関数でのみ使用できます。フックの戻り値は無視されます。 stackstrings スクリプトはこのフックを使用しません。

図 2 のコードは、 flare-emuの API が現在サポートしているコールバック関数、そのシグネチャ、およびそれらの使用方法の例を示しています。すべてのコールバックは、hookData という名前の引数を受け取ります。この名前付きディクショナリにより、ユーザーは、エミュレーションの前、最中、後に使用するアプリケーション固有のデータを提供できます。多くの場合、このディクショナリは、Unicorn での命名により、以下の例のように、ユーザー定義のコールバックで userData という名前が付けられます。 ironstringsはこれを使用して関数分析データにアクセスし、さまざまなフックに復元された文字列を保存します。ディクショナリは、 EmuHelperオブジェクトとエミュレーション メタ データへのアクセスも提供します。

フレアエミュのサンプルフックの実装
フレアエミュのサンプルフックの実装

インストール

GitHub インストール ページの説明に従って、 flare-emuをダウンロードしてインストールします。 ironstringsは、他の IDA Pro プラグインおよびスクリプトと共に、 ironstrings GitHub ページで入手できます。

flame -emuと ironstrings の両方が、IDA Pro 7.0 以降で利用可能な新しい IDAPython API を使用して書かれていることに注意してください。以前のプログラム バージョンとの後方互換性はありません。

使い方とオプション

IDA Pro でスクリプトを実行するには、File – Script File… (ALT+F7) に移動し、 ironstrings.pyを選択します。このスクリプトはすべての関数で自動的に実行され、その結果を IDA Pro の出力ウィンドウに出力し、スタック文字列を復元した場所にコメントを追加します。図 3 は、GandCrab サンプルから復元されたスタック文字列の場所のスクリプトの出力を示しています。このマルウェアの分析には、スクリプトで約 15 秒かかります。

難読化解除されたスタック文字列とそれらが特定された場所
難読化解除されたスタック文字列とそれらが特定された場所

図 4 は、この記事の冒頭で説明したスタックストリング作成の例を、 ironstringsを実行した後に分解したリストを示しています。

ironstrings を実行した後にスタックストリングをコメント化
ironstrings を実行した後にスタックストリングをコメント化

サンプルを分析した後、スクリプトは、復元されたすべての文字列の概要と一意のリストを提供します。ランサムウェア サンプルの出力を図 5 に示します。ここでは、Unicorn のコード エミュレーション中に無効なメモリ操作が原因で、ツールは 2 つの関数の分析に失敗しました。

スクリプトの要約と一意の文字列のリスト
スクリプトの要約と一意の文字列のリスト

さまざまなオプションを変更して、スクリプトの動作を変更できることに注意してください。たとえば、 ironstrings.pyファイルの先頭で出力形式を構成できます。スクリプトのREADMEファイルには、オプションの詳細が説明されています。

結論

このブログ投稿では、新しい IDAPython スクリプトironstringsの仕組みと、それを使用して IDA Pro でスタックストリングを自動的に回復する方法について説明します。分析防止手法の克服は、マルウェア分析のためのコード エミュレーションの多くの有用なアプリケーションの 1 つにすぎません。この投稿では、IDA Pro と Unicorn を統合することで、 flare-emuがこのための理想的な基盤を提供することを示しています。 Flare-emuのフック関数の詳細な説明は、独自の強力な自動化スクリプトを作成するのに役立ちます。ご質問、ご提案、フィードバックについては、 flare-emuおよびFlare-ida GitHub イシュー トラッカーからお問い合わせください。

参照: https://www.mandiant.com/resources/blog/flare-script-series-recovering-stackstrings-using-emulation-ironstrings

Comments

Copied title and URL