概要
FLOSS(FireEye Labs Obfuscated Strings Solver)は、Windows Portable Executableファイル(PEファイル)から難読化文字列の解除・抽出を行うためのツールです。このツールはセキュリティ企業Mandiant社が提供しており、Apache License 2.0に基づいてリリースされているオープンソースツールです。
最新バージョンのFLOSSは、以下の文字列タイプを抽出します。
- 静的文字列(static strings):ASCIIやUTF-16LE文字列
- スタック文字列(stack strings):実行時にスタック上に構築される文字列
- デコードされた文字列(decoded strings):難読化された文字列を復号した文字列
- タイト文字列(tight strings):スタック文字列と難読化文字列を組み合わせた文字列
FLOSSは、CLI(コマンドラインインターフェース)のツールで、PythonがインストールされているWindowsのコマンドプロンプトから実行することができます。Linuxの場合は、ターミナルから実行可能です。
コマンドラインの構文は以下のとおりです。
floss [--only{static,stack,decoded,tight}][--no{static,stack,decoded,tight}] [-j][-l ファイル名][-v][-q][-n 文字列の長さ][--function 復号したい文字列のアドレス]「解析対象ファイル」 > 「出力するファイル名」
各パラメーターの詳細は以下のとおりです。
パラメーター | 詳細 |
---|---|
--only | 抽出する文字列タイプ(static、stack、decoded、tight)を指定する |
--no | 抽出しない文字列タイプ(static、stack、decoded、tight)を指定する |
-j | 抽出結果をJSONファイルとして書き込む |
-l | FLOSSの抽出結果のJSONファイルを読み込む |
-v | 抽出内容を詳細表示する |
-q | 出力結果を表示させずに実行する |
-n | 文字列の最小長を指定する |
--function | デコードする文字列を直接指定する |
文字列抽出ツールとして有名なStringsと比較すると、抽出できるファイル形式に差がありますが、難読化された文字列を復号して抽出できるメリットがあります。解析対象のファイル形式や難読化の有無でツールを使い分けてください。
マルウェア解析における利用方法
マルウェア解析においては、表層解析や静的解析時のサポートとして利用することができます。難読化処理が行われているマルウェアからStringsでは抽出できない通信先などのIoC情報を得ることができます。
今回は、マルウェア「Anchor」に含まれる文字列を抽出する手順を以下に示します。
- コマンドプロンプトから実行する
- 実行ファイルから文字列を抽出する
- 得られた情報を元に調査を行う
詳細な手順
1.コマンドプロンプトから実行する
ここでは、「JSONファイルに出力する場合」の実行方法を紹介します。
・JSONファイルに出力する場合
上記コマンドで出力したJSONファイルの中身は、以下のようになっています。
Stringsとは違いJSON形式の出力が可能なため、抽出結果の分析や結果の再読み込みを容易に実行できるメリットがあります。
2.実行ファイルから文字列を抽出する
手順1のコマンドを実行すると、以下の文字列を確認しました。この文字列は、Stringsで抽出した文字列の中から確認できていません。
- anchor001
- toexample[.]bazar
3.得られた情報を元に調査を行う
「anchor001」を調べると、Anchorによって生成されるグローバル一意識別子に含まれる文字列ということがわかります*1。「toexample[.]bazar」を調べると、マルウェア「BazarLoader」の配布に使われているbazarドメインの通信先の一部だとわかります。このことから、マルウェアがBazzarLoaderに関係している可能性が考えられます。このほかにも、関数と思われる抽出文字列から機能を推定することも可能です。
文字列抽出だけではマルウェアの仕様を詳細に把握することは難しいですが、解析対象についてわかっていない点が多いマルウェア解析の初期段階での調査に役立ちます。