AlphaGolang
作成者: Juan Andres Guerrero-Saade (JAG-S @ SentinelLabs)
説明:
AlphaGolangは、マルウェアリバースエンジニアがGoバイナリを習得するためのIDAPythonスクリプト集です。このスクリプトを具体的なステップに分割することで、脆くて巨大なスクリプトを避け、アナリストがGoバイナリに取り組む際の手法を模倣しています。
スクリプトはGPLライセンスの下で公開されています(Tim Strazzere氏のオリジナルのGolangLoaderAssistに敬意を表し、それをPython3用にリファクタリング・更新しました。Timさんに感謝!)。コントリビューションを歓迎します!
必要条件: IDA Pro (理想的にはv7.6+) と Python3 (うんざり)
最初の2つのステップ(recreate_pclntab と function_discovery_and_renaming)はIDA v7.5-でも動作しますが、それ以降のスクリプトはIDAv7.6+が必要です。新しいバージョンは今後のスクリプトの理想的なターゲットです。
オリジナル参考資料: Mandiant Cyber Defense Summit 2021 講演 (動画準備中)
AlphaGolang 分析手法
-
ステップ 0: Goバイナリを識別するYARAルール (PE/ELF/MachO)
- identify_go_binaries.yara
- シンプルなヘッダチェック + GoビルドID文字列の正規表現。
- ビルドIDの長さの範囲を改善できる可能性あり。
-
ステップ 1: pclnテーブルの再構築
- recreate_pclntab.py (IDA v7.5- 互換)
- ヒューリスティックからgopclntabセクションを再構築します。
- 主にIDA v7.5-で有用です。
-
ステップ 2: pclnテーブルをウォークして関数を発見し、すべてに名前を追加
- function_renaming.py (IDA v7.5- 互換)
- golang_loader_assistから分割
- pclnテーブルに基づいて欠落している関数を総当たりで発見
- py3移行時の関数名クリーニングの問題を修正
- Go v1.18向けにAkamaiのPanchan!を基に改善をリファクタリング。Alex (CycleOfTheAbsurd)に感謝。
-
ステップ 3: ユーザー生成関数を表示
- categorize_go_folders.py (IDA v7.6+ 必須)
- 関数を自動的にフォルダに分類します
- IDAv7.6+が必要で、関数ビューで「フォルダを表示」を有効にする必要あり
- 更新日 2022.05.16: IDA v7.7のフォルダソートとの競合を修正
- このプラグインを実行する前にLuminaからメタデータを元に戻すことを強く推奨します。
-
ステップ 4: 文字列参照の修正
- fix_string_cast.py
- golang_loader_assistから分割
- 新しい文字列を定義する前に既存の文字列ブロブを未定義にするロジックを追加
- 新しい健全性チェックにより効果が大幅に向上
-
ステップ 5: 型情報の抽出 (作成者: Ivan Kwiatkowski)
- extract_types.py
newobject、makechanなどの呼び出しの引数にコメントを付ける
- これらのオブジェクトに適切なC型を適用し、名前を変更
- 人間が読める名前を取得し、コメントとして追加
未解決の修正とコントリビューションの余地:
- fix_string_cast.py
- リファクタリングとより良い文字列ロードヒューリスティックがまだ必要
- 巨大なバイナリでロックアップする可能性あり
- いくつかの間接的な文字列ロードメカニズムが欠落している
- extract_types.py
- 現在はPEおよびMach-Oファイルで動作し、ハードコードされた
.rdata または __rodata セクション名を探します
- varintエンコードされたサイズの適切なチェック/実装が必要
次のステップ:
- ユーザー生成関数による文字列参照の追跡
- ユーザー生成関数に基づくYARAシグネチャの自動生成
- ユーザー生成関数のHex-Rays疑似コード出力の生成
- 動的解析のための引数へのブレークポイント自動設定
- ???
謝辞:
- Tim Strazzere氏: オリジナルのgolang_loader_assistを公開してくれたこと
- Milan Bohacek (Avast Software s.r.o.)氏: idatree APIの理解において貴重な助けを提供してくれた
- Joakim Kennedy (Intezer)
- Ivan Kwiatkowski (Kaspersky GReAT)氏: ステップ5の作成
- Igor Kuznetsov (Kaspersky GReAT)
- Alex (別名 CycleOfTheAbsurd) (ESET)氏: Go v1.18サポートのためにステップ2をリファクタリング