FLARE Obfuscated String Solver (FLOSS) は、アナリストがマルウェア サンプルから隠された文字列を抽出するのを長年サポートしてきました。過去数か月にわたって、新しい機能を追加し、ツールのパフォーマンスを向上させてきました。このブログ投稿では、新しい文字列の難読化解除技術、簡素化されたツールの使用法、はるかに高速な結果出力など、エキサイティングな新機能と改善点を紹介します。 FLOSS ロゴも更新しました。
注意: FLOSS はマルウェアから文字列を抽出します
FLOSS は、コンパイルされたプログラムを分析し、データをデコードする可能性のある関数を特定し、隠し文字列を自動的に解読します。最初に、FLOSS は 3 つの主要な文字列タイプを抽出しました: 逐語的に含まれる静的文字列、専用関数によってデコードされたエンコードされた文字列、断片的に構築されたスタック文字列です。 FLOSS の背景や復習については、元のブログ投稿を参照してください。
この新しいリリースでは、難読化された文字列のまったく新しいクラスをデコードする方法をFLOSSに教えました…
新しい文字列の難読化解除: タイトな文字列
最新の更新により、FLOSS は「タイトな文字列」と呼ばれる追加の文字列難読化手法を処理します。タイトな文字列は、スタック文字列とエンコードされた文字列の組み合わせです。スタック文字列と同様に、タイトな文字列は、実行時にスタック上に構築される個々のバイトで構成されます。エンコードされた文字列と同様に、これらのバイトは使用前にデコードされます。このデコードは、多くの場合、タイト ループ (何度も繰り返される短いコード シーケンス) で発生するため、タイト ストリングと呼ばれます。タイトな名前とコア アルゴリズムを提供してくれた Blaine Stancill に敬意を表します。
2021 年に数十回遭遇したKEGTAP、BEERBOT、ANCHORなどのマルウェア ファミリでタイトな文字列が蔓延していたため、タイトな文字列のサポートを追加する動機がありました。難読化された文字列のデコードに FLOSS が成功したことが、マルウェアの作成者によるタイトな文字列の開発を促進したのではないでしょうか。文字列。また、 ADVobfuscatorプロジェクトによって提供されるようなインライン化された文字列デコード ルーチンを介して、タイトな文字列が意図的にバイナリに含まれる可能性があることにも注意してください。
図 1 は、MD5 ハッシュ 9a16a348d3f4e7da3e8746667624115f と SHA256 ハッシュ 2065157b834e1116abdd5d67167c77c6348361e04a8085aa382909500f1bbe69 を持つマルウェア サンプルのタイトな文字列の例を示しています。
難読化された文字列バイト (0x6D、0x28、0x46、…) を先頭ブロックの連続するスタック オフセット (var_630、var_62F、var_62E、…) に格納した後、マルウェアは 2 番目のブロックを繰り返し実行してデータをデコードします。
図 2 は、これら 2 つのブロックの逆コンパイルを示しています。歯科医への訪問とリバース エンジニアリングのどちらが静的に楽しいかは議論の余地があります。幸いなことに、FLOSS はその両方からあなたを救うことができるようになりました!既存のアルゴリズムと同様に、識別されたプログラム部分をエミュレートします。 FLOSS は、難読化されたデータを仮想スタック上に構築し、タイトなループをエミュレートしてデータをデコードし、ループが終了すると仮想スタックから文字列を抽出します。
この例では、FLOSS は、対応する Windows API 関数を動的に解決するためにマルウェアが使用する文字列InternetReadFile
を復元します。図 3 は、復元された文字列の FLOSS の詳細な出力を示しています。
その他の改善
新しい文字列解読アルゴリズムを追加するだけでなく、既存の識別およびエミュレーション アルゴリズムの信頼性とパフォーマンスを向上させました。 FLOSS の結果に含まれる誤検知の難読化解除された文字列が少なくなりました。これは、新しいバージョンの FLOSS を実行しているときに、ジャンク出力に気を取られることが少なくなることを意味します。これを容易にするために、FLIRT 署名によるライブラリ関数の認識を追加し、文字列のフィルタリングとサニタイズ方法を改善しました。
文字列をデコードしない関数の高速エミュレーションとショートカット エミュレーションにより、FLOSS の全体的なランタイムが大幅に向上します。テスト中に、平均速度が 47% 向上したことがわかりました。これは、特に大規模な処理パイプラインの一部として、マルウェアをより迅速に処理できることを意味します。 FLOSS の以前のバージョンは、完全な分析の後にのみ結果を提供していました。図 4 に示すように、更新されたツールは、解読された文字列が検出されたときにそれを提供し、分析の進行状況を示します。これにより、ツールの応答性が向上することがわかりました。ツールがすぐに機能しているかどうかがよくわかり、より忍耐強くなる傾向があります (または、プログレス バーが完了するのを見ることに夢中になっているだけかもしれません)。
最後に、API エミュレーション フックを追加し、エミュレーション エンジンと基盤となる分析フレームワークを更新しました。すべての改善を組み合わせることで、FLOSS は以前よりも多くのマルウェア サンプルをエミュレートできるようになりました!
FLOSS の使用方法と結果出力の改善
FLOSS ユーザーの場合、新しいバージョンではコマンドライン引数が大幅に簡素化されています。すべての文字列を抽出するには、前と同じように FLOSS を実行するだけです。
$ floss malware.exe
静的文字列を無視して難読化された文字列のみに注目したい場合など、文字列のクラスを気にしないことがわかっている場合は、 --no
引数を使用して、たとえば静的文字列を抽出しないようにすることができます。
$ floss malware.exe --no static
抽出したい特定の文字列タイプに焦点を当てるには、 --only
オプションを使用します。
$ floss malware.exe --only tight decoded
図 5 は、新しい FLOSS 結果出力の例を示しています。 FLOSS の以前のバージョンでは、このファイルから文字列を正常にデコードできませんでした。
[…] |
利用可能なすべてのオプションを表示するには、 floss -h
を使用してヘルプを参照してください。
FLOSS API と統合
FLOSS を Python 2 から Python 3 に移行しました (ついに!)。これにより、FLOSS は他のほとんどの最新の Python プロジェクトに対応し、パフォーマンスをさらに向上させることができます。
大規模なプロジェクトで FLOSS をモジュールとして使用する場合は、多くの API が変更されており、それに応じてツールを更新する必要があることに注意してください。他のツールとの統合と相互運用性を容易にするために、すべての FLOSS 結果は-j引数を使用して簡単に JSON ドキュメントにエクスポートできます。このようにして、任意のプログラミング言語からサブプロセスとして FLOSS を簡単に実行し、結果をプログラムで操作できます。
FLOSSに電話して、ありがとう
コミュニティの継続的なサポート、バグ レポート、機能リクエストに感謝します。長年にわたり、何十人もの人々が FLOSS に貢献してきました。アップデートがお役に立てば幸いです。https://github.com/mandiant/flare-floss/issuesでご連絡をお待ちしております。 FLOSS のすべてのリリースはhttps://github.com/mandiant/flare-floss/releasesで、ソース コードはhttps://github.com/mandiant/flare-flossで見つけることができます。
Comments