binary-re-triage
未知の実行ファイルやファームウェアに対し、rabin2を用いてアーキテクチャ、ABI、依存関係を迅速に特定し、ファイルの種類や構造を解析することで、その正体を素早く把握するSkill。
📜 元の英語説明(参考)
Use when first encountering an unknown binary, ELF file, executable, or firmware blob. Fast fingerprinting via rabin2 - architecture detection (ARM, x86, MIPS), ABI identification, dependency mapping, string extraction. Keywords - "what is this binary", "identify architecture", "check file type", "rabin2", "file analysis", "quick scan"
🇯🇵 日本人クリエイター向け解説
未知の実行ファイルやファームウェアに対し、rabin2を用いてアーキテクチャ、ABI、依存関係を迅速に特定し、ファイルの種類や構造を解析することで、その正体を素早く把握するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o binary-re-triage.zip https://jpskill.com/download/16698.zip && unzip -o binary-re-triage.zip && rm binary-re-triage.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/16698.zip -OutFile "$d\binary-re-triage.zip"; Expand-Archive "$d\binary-re-triage.zip" -DestinationPath $d -Force; ri "$d\binary-re-triage.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
binary-re-triage.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
binary-re-triageフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
バイナリトリアージ (フェーズ 1)
目的
より詳細な分析を行う前に、ベースラインとなる事実を確立するための迅速なフィンガープリント。数分ではなく、数秒で実行します。
使用するタイミング
- 不明なバイナリに初めて接触したとき
- ツールの選択のためにアーキテクチャ/ABI情報が必要なとき
- 迅速な機能評価が必要なとき
- 高コストな分析にコミットする前
主要な原則
事実を迅速に収集し、分析は後回しにする。
このフェーズでは、バイナリがどのように動作するかではなく、バイナリが何であるかを特定します。
トリアージシーケンス
ステップ 1: ファイルの識別
# 基本的な識別
file binary
# 期待される出力パターン:
# ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3
# ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1
抽出:
- アーキテクチャ (ARM, ARM64, x86_64, MIPS)
- ビット幅 (32/64)
- エンディアン (LSB/MSB)
- リンクタイプ (static/dynamic)
- インタープリタパス (libc インジケータ)
ステップ 2: 構造化されたメタデータ (rabin2)
# すべてのメタデータを JSON として
rabin2 -q -j -I binary | jq .
# 主要なフィールド:
# .arch - "arm", "x86", "mips"
# .bits - 32 or 64
# .endian - "little" or "big"
# .os - "linux", "none"
# .machine - "ARM", "AARCH64"
# .stripped - true/false
# .static - true/false
ステップ 3: ABI の検出
# インタープリタの検出
readelf -p .interp binary 2>/dev/null
# または rabin2 経由
rabin2 -I binary | grep interp
# ARM 固有: float ABI
readelf -A binary | grep "Tag_ABI_VFP_args"
# hard-float: "VFP registers"
# soft-float: missing or "compatible"
インタープリタ → Libc マッピング:
| Interpreter | Libc | Notes |
|---|---|---|
/lib/ld-linux-armhf.so.3 |
glibc | ARM hard-float |
/lib/ld-linux.so.3 |
glibc | ARM soft-float |
/lib/ld-musl-arm.so.1 |
musl | ARM 32-bit |
/lib/ld-musl-aarch64.so.1 |
musl | ARM 64-bit |
/lib/ld-uClibc.so.0 |
uClibc | Embedded |
/lib64/ld-linux-x86-64.so.2 |
glibc | x86_64 |
ステップ 4: 依存関係
# ライブラリの依存関係
rabin2 -q -j -l binary | jq '.libs[]'
# 一般的なパターン:
# libcurl.so.* → HTTP client
# libssl.so.* → TLS/crypto
# libpthread.so.* → Threading
# libz.so.* → Compression
# libsqlite3.so.* → Local database
ステップ 5: エントリポイントとエクスポート
# エントリポイント
rabin2 -q -j -e binary | jq .
# エクスポート (共有ライブラリの場合)
rabin2 -q -j -E binary | jq '.exports[] | {name, vaddr}'
ステップ 6: クイック文字列スキャン
# メタデータ付きのすべての文字列
rabin2 -q -j -zz binary | jq '.strings | length' # まずカウント
# 興味深い文字列をフィルタリング (URL, パス, エラー)
rabin2 -q -j -zz binary | jq '
.strings[] |
select(.length > 8) |
select(.string | test("http|ftp|/etc|/var|error|fail|pass|key|token"; "i"))
'
ステップ 7: インポート分析
# すべてのインポート
rabin2 -q -j -i binary | jq '.imports[] | {name, lib}'
# 機能ごとにグループ化
rabin2 -q -j -i binary | jq '
.imports | group_by(.lib) |
map({lib: .[0].lib, functions: [.[].name]})
'
機能マッピング
| Import Pattern | Capability |
|---|---|
socket, connect, send |
Network client |
bind, listen, accept |
Network server |
open, read, write |
File I/O |
fork, exec*, system |
Process spawning |
pthread_* |
Multi-threading |
SSL_*, EVP_* |
Cryptography |
dlopen, dlsym |
Dynamic loading |
mmap, mprotect |
Memory manipulation |
出力形式
トリアージ後、構造化された事実を記録します。
{
"artifact": {
"path": "/path/to/binary",
"sha256": "abc123...",
"size_bytes": 245760
},
"identification": {
"arch": "arm",
"bits": 32,
"endian": "little",
"os": "linux",
"stripped": true,
"static": false
},
"abi": {
"interpreter": "/lib/ld-musl-arm.so.1",
"libc": "musl",
"float_abi": "hard"
},
"dependencies": [
"libcurl.so.4",
"libssl.so.1.1",
"libz.so.1"
],
"capabilities_inferred": [
"network_client",
"tls_encryption",
"compression"
],
"strings_of_interest": [
{"value": "https://api.vendor.com/telemetry", "type": "url"},
{"value": "/etc/config.json", "type": "path"}
],
"complexity_estimate": {
"functions": "unknown (stripped)",
"strings": 847,
"imports": 156
}
}
知識の記録
トリアージが完了したら、エピソード記憶のために調査結果を記録します。
[BINARY-RE:triage] {filename} (sha256: {hash})
Identification:
Architecture: {arch} {bits}-bit {endian}
Libc: {glibc|musl|uclibc} ({interpreter_path})
Stripped: {yes|no}
Size: {bytes}
FACT: Links against {library} (source: rabin2 -l)
FACT: Contains {N} strings of interest (source: rabin2 -zz)
FACT: Imports {function} from {library} (source: rabin2 -i)
Capabilities inferred:
- {capability_1} (evidence: {import/string})
- {capability_2} (evidence: {import/string})
HYPOTHESIS: {what binary likely does} (confidence: {0.0-1.0})
QUESTION: {open unknown that needs investigation}
Next phase: {static-analysis|dynamic-analysis}
Sysroot needed: {path or "extract from device"}
ジャーナルエントリの例
[BINARY-RE:triage] thermostat_daemon (sha256: a1b2c3d4...)
Identification:
Architecture: ARM 32-bit LE
Libc: musl (/lib/ld-musl-arm.so.1)
Stripped: yes
Size: 153,600 bytes
FACT: Links against libcurl.so.4 (source: rabin2 -l)
FACT: Links against libssl.so.1.1 (source: rabin2 -l)
FACT: Contains string "api.thermco.com" (source: rabin2 -zz)
FACT: Imports curl_easy_perform (source: rabin2 -i)
Capabilities inferred:
- HTTP client (evidence: libcurl import)
- TLS encryption (evidence: libssl import)
- Network communication (evidence: URL string)
HYPOTHESIS: Telemetry client that reports to api.thermco.com (confidence: 0.6)
QUESTION: What data does it collect and transmit?
Next phase: static-analysis
Sysroot needed: musl ARM (extract from device or Alpine)
判断ポイント
トリアージ後、以下を決定します。
- Sysroot の選択 - arch に基づいて +
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Binary Triage (Phase 1)
Purpose
Quick fingerprinting to establish baseline facts before deeper analysis. Runs in seconds, not minutes.
When to Use
- First contact with an unknown binary
- Need architecture/ABI info for tool selection
- Quick capability assessment
- Before committing to expensive analysis
Key Principle
Gather facts fast, defer analysis.
This phase identifies WHAT the binary is, not HOW it works.
Triage Sequence
Step 1: File Identification
# Basic identification
file binary
# Expected output patterns:
# ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3
# ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1
Extract:
- Architecture (ARM, ARM64, x86_64, MIPS)
- Bit width (32/64)
- Endianness (LSB/MSB)
- Link type (static/dynamic)
- Interpreter path (libc indicator)
Step 2: Structured Metadata (rabin2)
# All metadata as JSON
rabin2 -q -j -I binary | jq .
# Key fields:
# .arch - "arm", "x86", "mips"
# .bits - 32 or 64
# .endian - "little" or "big"
# .os - "linux", "none"
# .machine - "ARM", "AARCH64"
# .stripped - true/false
# .static - true/false
Step 3: ABI Detection
# Interpreter detection
readelf -p .interp binary 2>/dev/null
# Or via rabin2
rabin2 -I binary | grep interp
# ARM-specific: float ABI
readelf -A binary | grep "Tag_ABI_VFP_args"
# hard-float: "VFP registers"
# soft-float: missing or "compatible"
Interpreter → Libc mapping:
| Interpreter | Libc | Notes |
|---|---|---|
/lib/ld-linux-armhf.so.3 |
glibc | ARM hard-float |
/lib/ld-linux.so.3 |
glibc | ARM soft-float |
/lib/ld-musl-arm.so.1 |
musl | ARM 32-bit |
/lib/ld-musl-aarch64.so.1 |
musl | ARM 64-bit |
/lib/ld-uClibc.so.0 |
uClibc | Embedded |
/lib64/ld-linux-x86-64.so.2 |
glibc | x86_64 |
Step 4: Dependencies
# Library dependencies
rabin2 -q -j -l binary | jq '.libs[]'
# Common patterns:
# libcurl.so.* → HTTP client
# libssl.so.* → TLS/crypto
# libpthread.so.* → Threading
# libz.so.* → Compression
# libsqlite3.so.* → Local database
Step 5: Entry Points & Exports
# Entry points
rabin2 -q -j -e binary | jq .
# Exports (for shared libraries)
rabin2 -q -j -E binary | jq '.exports[] | {name, vaddr}'
Step 6: Quick String Scan
# All strings with metadata
rabin2 -q -j -zz binary | jq '.strings | length' # Count first
# Filter interesting strings (URLs, paths, errors)
rabin2 -q -j -zz binary | jq '
.strings[] |
select(.length > 8) |
select(.string | test("http|ftp|/etc|/var|error|fail|pass|key|token"; "i"))
'
Step 7: Import Analysis
# All imports
rabin2 -q -j -i binary | jq '.imports[] | {name, lib}'
# Group by capability
rabin2 -q -j -i binary | jq '
.imports | group_by(.lib) |
map({lib: .[0].lib, functions: [.[].name]})
'
Capability Mapping
| Import Pattern | Capability |
|---|---|
socket, connect, send |
Network client |
bind, listen, accept |
Network server |
open, read, write |
File I/O |
fork, exec*, system |
Process spawning |
pthread_* |
Multi-threading |
SSL_*, EVP_* |
Cryptography |
dlopen, dlsym |
Dynamic loading |
mmap, mprotect |
Memory manipulation |
Output Format
After triage, record structured facts:
{
"artifact": {
"path": "/path/to/binary",
"sha256": "abc123...",
"size_bytes": 245760
},
"identification": {
"arch": "arm",
"bits": 32,
"endian": "little",
"os": "linux",
"stripped": true,
"static": false
},
"abi": {
"interpreter": "/lib/ld-musl-arm.so.1",
"libc": "musl",
"float_abi": "hard"
},
"dependencies": [
"libcurl.so.4",
"libssl.so.1.1",
"libz.so.1"
],
"capabilities_inferred": [
"network_client",
"tls_encryption",
"compression"
],
"strings_of_interest": [
{"value": "https://api.vendor.com/telemetry", "type": "url"},
{"value": "/etc/config.json", "type": "path"}
],
"complexity_estimate": {
"functions": "unknown (stripped)",
"strings": 847,
"imports": 156
}
}
Knowledge Journaling
After triage completes, record findings for episodic memory:
[BINARY-RE:triage] {filename} (sha256: {hash})
Identification:
Architecture: {arch} {bits}-bit {endian}
Libc: {glibc|musl|uclibc} ({interpreter_path})
Stripped: {yes|no}
Size: {bytes}
FACT: Links against {library} (source: rabin2 -l)
FACT: Contains {N} strings of interest (source: rabin2 -zz)
FACT: Imports {function} from {library} (source: rabin2 -i)
Capabilities inferred:
- {capability_1} (evidence: {import/string})
- {capability_2} (evidence: {import/string})
HYPOTHESIS: {what binary likely does} (confidence: {0.0-1.0})
QUESTION: {open unknown that needs investigation}
Next phase: {static-analysis|dynamic-analysis}
Sysroot needed: {path or "extract from device"}
Example Journal Entry
[BINARY-RE:triage] thermostat_daemon (sha256: a1b2c3d4...)
Identification:
Architecture: ARM 32-bit LE
Libc: musl (/lib/ld-musl-arm.so.1)
Stripped: yes
Size: 153,600 bytes
FACT: Links against libcurl.so.4 (source: rabin2 -l)
FACT: Links against libssl.so.1.1 (source: rabin2 -l)
FACT: Contains string "api.thermco.com" (source: rabin2 -zz)
FACT: Imports curl_easy_perform (source: rabin2 -i)
Capabilities inferred:
- HTTP client (evidence: libcurl import)
- TLS encryption (evidence: libssl import)
- Network communication (evidence: URL string)
HYPOTHESIS: Telemetry client that reports to api.thermco.com (confidence: 0.6)
QUESTION: What data does it collect and transmit?
Next phase: static-analysis
Sysroot needed: musl ARM (extract from device or Alpine)
Decision Points
After triage, determine:
- Sysroot selection - Based on arch + libc
- Analysis tool chain - r2 vs Ghidra vs both
- Dynamic analysis feasibility - QEMU viability based on arch
- Initial hypotheses - What does this binary likely do?
Next Steps
→ Proceed to binary-re-static-analysis for function enumeration
→ Or binary-re-dynamic-analysis if behavior observation is priority