binary-triage について
binary-triageは、詳細な分析に入る前にバイナリを素早く調査するためのスキルです。プログラムの構造や注目すべき挙動を把握し、調査対象を特定して、優先度付きの具体的な次の作業をまとめます。
主な機能
- 01メモリセクションの調査
- 02文字列とインポートの確認
- 03関数とクロスリファレンスの確認
- 04対象を絞った初期逆コンパイル
- 05優先度付きの次の作業リスト
活用シーン
- 01マルウェアバイナリの初期評価
- 02調査対象となる不審なAPIや文字列の発見
- 03パック済みまたはシンボル除去済みバイナリの詳細分析計画
MCP 対応
ReVaのMCPツールを使い、プログラムファイル、メモリ、文字列、シンボル、関数、参照関係、逆コンパイル結果を調査します。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ cyberkaida/ reverse-engineering-assistant --skill binary-triageインストール後、Claude Code で/binary-triageを入力して読み込まれたか確認します。
詳細
バイナリのトリアージ
手順
バイナリをトリアージして、何をするものかをすばやく把握します。これは初期調査であり、詳細な解析ではありません。目的は次のとおりです。
- 主要なコンポーネントと動作を特定する
- 不審な領域や興味深い領域に印を付ける
- さらに詳しく調査するための次の手順をタスクリストにまとめる
ReVa によるバイナリのトリアージ
ReVa の MCP ツールを使って、次の体系的なワークフローに従います。
1. プログラムを特定する
get-current-programを使用して、アクティブなプログラムを確認します- または
list-project-filesを使用して、プロジェクトで利用可能なプログラムを確認します - 後続のツールで使う
programPath(例:"/Hatchery.exe")を記録します
2. メモリレイアウトを調査する
get-memory-blocksを使用して、バイナリの構造を把握します- 主要なセクションを調べます。
.text- 実行可能コード.data- 初期化済みデータ.rodata- 読み取り専用データ(文字列、定数).bss- 未初期化データ
- 次のような特異な特徴に印を付けます。
- 異常に大きなセクション
- パックまたは暗号化されたセクション
- 実行可能なデータセクション
- 書き込み可能なコードセクション
3. 文字列を調査する
get-strings-countを使用して、文字列の合計数を確認しますget-stringsをページネーション付きで使用します(一度に100~200件)- 機能や悪意のある動作を示す手掛かりを探します。
- ネットワーク:URL、IP アドレス、ドメイン名、API エンドポイント
- ファイルシステム:ファイルパス、レジストリキー、設定ファイル
- API:関数名、ライブラリ参照
- メッセージ:エラーメッセージ、デバッグ文字列、ログメッセージ
- 不審なキーワード:admin、password、credential、token、crypto、encrypt、decrypt、download、execute、inject、shellcode、payload
4. シンボルとインポートを調査する
includeExternal=trueを指定してget-symbols-countを使用し、インポート数を数えますincludeExternal=trueとfilterDefaultNames=trueを指定してget-symbolsを使用します- 外部シンボル(ライブラリからのインポート)に注目します
- 興味深い、または不審なインポートにカテゴリ別の印を付けます。
- ネットワーク API:connect、send、recv、WSAStartup、getaddrinfo、curl_*、socket
- ファイル I/O:CreateFile、WriteFile、ReadFile、fopen、fwrite、fread
- プロセス操作:CreateProcess、exec、fork、system、WinExec、ShellExecute
- メモリ操作:VirtualAlloc、VirtualProtect、mmap、mprotect
- 暗号:CryptEncrypt、CryptDecrypt、EVP_、AES_、bcrypt、RC4
- 解析対策:IsDebuggerPresent、CheckRemoteDebuggerPresent、ptrace
- レジストリ:RegOpenKey、RegSetValue、RegQueryValue
- インポート数とシンボル総数の比率を記録します(インポートの使用が多い場合、ライブラリへの依存度が高い可能性があります)
5. 関数を調査する
filterDefaultNames=trueを指定してget-function-countを使用し、名前付き関数の数を数えますfilterDefaultNames=falseを指定してget-function-countを使用し、すべての関数の数を数えます- 名前付き関数と名前のない関数の比率を計算します(名前のない関数の比率が高い場合、シンボルが削除されたバイナリである可能性があります)
filterDefaultNames=trueを指定してget-functionsを使用し、名前付き関数を一覧表示します- 主要な関数を特定します。
- エントリポイント:
entry、start、_start - メイン関数:
main、WinMain、DllMain、_main - 不審な名前:シンボルが削除されていない場合は、手掛かりとなる関数名を探します
- エントリポイント:
6. 重要な発見事項をクロスリファレンス分析する
- 手順3で見つかった興味深い文字列について:
direction="to"とincludeContext=trueを指定してfind-cross-referencesを使用します- 不審な文字列を参照している関数を特定します
- 手順4で見つかった不審なインポートについて:
direction="to"とincludeContext=trueを指定してfind-cross-referencesを使用します- 不審な API を呼び出している関数を特定します
- これにより、どの関数を詳細に調査すべきか、優先順位を付けやすくなります
7. 初期の選択的な逆コンパイル
- エントリーポイントまたはメイン関数に対して
get-decompilationを使用します- 最初に約30行を取得するには、
limit=30を設定します - 呼び出し元を確認するには、
includeIncomingReferences=trueを設定します - コンテキストのスニペットを確認するには、
includeReferenceContext=trueを設定します
- 最初に約30行を取得するには、
- ステップ6で特定した、疑わしい関数1~2個に対して
get-decompilationを使用します- すばやく概要を把握するには、
limit=20-30を設定します
- すばやく概要を把握するには、
- 高レベルのパターンを確認します:
- ループ(暗号化/復号ルーチン)
- ネットワーク操作
- ファイル操作
- プロセスの作成
- 疑わしい制御フロー(難読化の兆候)
- まだ詳細な分析は行わないでください。ここでは、全体的な動作を把握するだけです
8. 調査結果を記録し、タスクリストを作成する
TodoWriteツールを使って、次のような項目を含む実行可能なタスクリストを作成します:- 「文字列 'http://malicious-c2.com' を調査する(0x00401234 で参照)」
- 「関数 sub_401000 を逆コンパイルする(VirtualAlloc、memcpy、CreateThread を呼び出す)」
- 「関数 encrypt_payload の暗号処理を分析する(CryptEncrypt を使用)」
- 「アンチデバッグチェックを追跡する(0x00402000 の IsDebuggerPresent)」
- 「展開ルーチンを探すため、パックされたセクション .UPX0 を調べる」
- 各ToDoは次の条件を満たす必要があります:
- 具体的である(アドレス、関数名、文字列を含む)
- 実行可能である(調査が必要な内容が明確である)
- 優先順位が付いている(最も疑わしい項目を先にする)
出力形式
以下の構成で、トリアージの調査結果をユーザーに提示します:
プログラムの概要
- 名前:[programPath から取得したプログラム名]
- 種類:[実行ファイルの種類 — PE、ELF、Mach-O など]
- プラットフォーム:[Windows、Linux、macOS など]
メモリレイアウト
- 合計サイズ:[バイト/KB/MB 単位のサイズ]
- 主要セクション:[サイズとアクセス許可を含む主なセクションの一覧]
- 特異な特徴:[パック、暗号化、疑わしいセクションなど]
文字列分析
- 文字列の合計数:[get-strings-count から取得した件数]
- 注目すべき調査結果:[興味深い文字列とそのコンテキストの箇条書き]
- 疑わしい兆候:[見つかったURL、IP、疑わしいキーワード]
インポート分析
- シンボルの合計数:[get-symbols-count から取得した件数]
- 外部インポート:[外部シンボルの件数]
- 主要ライブラリ:[インポートされた主なライブラリ]
- 疑わしいAPI:[懸念されるインポートの分類一覧]
関数分析
- 関数の合計数:[filterDefaultNames=false を指定した件数]
- 名前付き関数:[filterDefaultNames=true を指定した件数]
- シンボル削除の状態:[比率に基づく「はい」/「いいえ」]
- エントリーポイント:[アドレスと名前]
- メイン関数:[アドレスと名前]
- 主要関数:[特定した重要な関数の一覧]
疑わしい兆候
[見つかった危険な兆候を、重大度の高い順に箇条書きで記載]
推奨される次のステップ
[ステップ8で作成したタスクリストを提示]
- 各項目は具体的で、実行可能なものにします
- 重大度/重要度の高い順に優先順位を付けます
- アドレス、関数名、コンテキストを含めます
重要な注意事項
- 深さより速度を優先:これはトリアージであり、完全な分析ではありません。各ステップをすばやく進めてください。
- ページネーションを使用:文字列や関数を一度に数千件リクエストしないでください。100~200件ずつ取得します。
- 異常に注目:通常と異なる、疑わしい、または興味深いものにフラグを立ててください。
- コンテキストが重要:相互参照を使用する際は、コードスニペットを確認できるよう
includeContext=trueを有効にしてください。 - 実行可能なToDoを作成:各次のステップは、別のエージェントが実行できる程度に具体的にしてください。
- 体系的に進める:網羅的に確認するため、8つのステップすべてを順番に実行してください。
コメント
Markdown 対応