FLOSS バージョン 2.0

FLOSS LOGO news

FLARE Obfuscated String Solver (FLOSS) は、アナリストがマルウェア サンプルから隠された文字列を抽出するのを長年サポートしてきました。過去数か月にわたって、新しい機能を追加し、ツールのパフォーマンスを向上させてきました。このブログ投稿では、新しい文字列の難読化解除技術、簡素化されたツールの使用法、はるかに高速な結果出力など、エキサイティングな新機能と改善点を紹介します。 FLOSS ロゴも更新しました。

FLOSS LOGO

注意: 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 番目のブロックを繰り返し実行してデータをデコードします。

図 1: タイトな文字列デコード シーケンスの逆アセンブリの例
図 1: タイトな文字列デコード シーケンスの逆アセンブリの例

図 2 は、これら 2 つのブロックの逆コンパイルを示しています。歯科医への訪問とリバース エンジニアリングのどちらが静的に楽しいかは議論の余地があります。幸いなことに、FLOSS はその両方からあなたを救うことができるようになりました!既存のアルゴリズムと同様に、識別されたプログラム部分をエミュレートします。 FLOSS は、難読化されたデータを仮想スタック上に構築し、タイトなループをエミュレートしてデータをデコードし、ループが終了すると仮想スタックから文字列を抽出します。

図 2: タイトな文字列デコード シーケンスの逆コンパイル
図 2: タイトな文字列デコード シーケンスの逆コンパイル

この例では、FLOSS は、対応する Windows API 関数を動的に解決するためにマルウェアが使用する文字列InternetReadFileを復元します。図 3 は、復元された文字列の FLOSS の詳細な出力を示しています。

図 3: FLOSS のタイトな文字列の結果の抜粋
図 3: FLOSS のタイトな文字列の結果の抜粋

その他の改善

新しい文字列解読アルゴリズムを追加するだけでなく、既存の識別およびエミュレーション アルゴリズムの信頼性とパフォーマンスを向上させました。 FLOSS の結果に含まれる誤検知の難読化解除された文字列が少なくなりました。これは、新しいバージョンの FLOSS を実行しているときに、ジャンク出力に気を取られることが少なくなることを意味します。これを容易にするために、FLIRT 署名によるライブラリ関数の認識を追加し、文字列のフィルタリングとサニタイズ方法を改善しました。

文字列をデコードしない関数の高速エミュレーションとショートカット エミュレーションにより、FLOSS の全体的なランタイムが大幅に向上します。テスト中に、平均速度が 47% 向上したことがわかりました。これは、特に大規模な処理パイプラインの一部として、マルウェアをより迅速に処理できることを意味します。 FLOSS の以前のバージョンは、完全な分析の後にのみ結果を提供していました。図 4 に示すように、更新されたツールは、解読された文字列が検出されたときにそれを提供し、分析の進行状況を示します。これにより、ツールの応答性が向上することがわかりました。ツールがすぐに機能しているかどうかがよくわかり、より忍耐強くなる傾向があります (または、プログレス バーが完了するのを見ることに夢中になっているだけかもしれません)。

図 4: 文字列がデコードされたときの FLOSS ライブ結果出力
図 4: 文字列がデコードされたときの FLOSS ライブ結果出力

最後に、API エミュレーション フックを追加し、エミュレーション エンジンと基盤となる分析フレームワークを更新しました。すべての改善を組み合わせることで、FLOSS は以前よりも多くのマルウェア サンプルをエミュレートできるようになりました!

FLOSS の使用方法と結果出力の改善

FLOSS ユーザーの場合、新しいバージョンではコマンドライン引数が大幅に簡素化されています。すべての文字列を抽出するには、前と同じように FLOSS を実行するだけです。

$ floss malware.exe

静的文字列を無視して難読化された文字列のみに注目したい場合など、文字列のクラスを気にしないことがわかっている場合は、 --no引数を使用して、たとえば静的文字列を抽出しないようにすることができます。

$ floss malware.exe --no static

抽出したい特定の文字列タイプに焦点を当てるには、 --onlyオプションを使用します。

$ floss malware.exe --only tight decoded

図 5 は、新しい FLOSS 結果出力の例を示しています。 FLOSS の以前のバージョンでは、このファイルから文字列を正常にデコードできませんでした。

図 5: FLOSS の最終的な要約結果の出力

FLARE FLOSS RESULTS (version 2.0.0)

+------------------------ +------------------------------------------------+

| file path              | 2065157b834e1116abdd5d67167c77c6348361e04a8... |

| extracted strings      |                                                |

|  static strings        | Disabled                                       |

|  stack strings         | Disabled                                       |

|  tight strings         | 55                                             |

|  decoded strings       | 53                                             |

+------------------------+------------------------------------------------+

 

----------------------------

| FLOSS TIGHT STRINGS (55) |

----------------------------

%d%02d%02d
bcrypt.dll
BCryptOpenAlgorithmProvider
BCryptImportKeyPair
BCryptVerifySignature
BCryptCloseAlgorithmProvider
ReadFile
kernel32.dll
GetTempPathW
kernel32.dll
~pkg%d%S
Date
HttpQueryInfoA
wininet.dll
Set-Cookie
.bazar
%i.%i.%i.%i
Host: %s
update: %s
XTag
InternetQueryDataAvailable
wininet.dll
InternetReadFile
CoInitialize
ole32.dll
CoInitializeSecurity
GetTempPathW
kernel32.dll
GetTempFileNameW
http://127.0.0.1/pics.html
[…]

------------------------------

| FLOSS DECODED STRINGS (53) |

------------------------------
CoInitialize
ole32.dll
CoInitializeSecurity
CoCreateInstance
CoTaskMemFree
HEAD
HttpQueryInfoA
Date
wininet.dll
bcrypt.dll
BCryptOpenAlgorithmProvider
BCryptImportKeyPair
BCryptVerifySignature
BCryptCloseAlgorithmProvider
kernel32.dll
ReadFile
%d%02d%02d
CoInitialize
ole32.dll
Font Service
CoInitializeSecurity
CoCreateInstance

[…]

利用可能なすべてのオプションを表示するには、 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で見つけることができます。

 

参照: https://www.mandiant.com/resources/blog/floss-version-2

Comments

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