Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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"
.claude/skills/aiskillstore-binary-re-triage/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 73% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 95% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 200% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 43% | 0% |
Quick fingerprinting to establish baseline facts before deeper analysis. Runs in seconds, not minutes.
Gather facts fast, defer analysis.
This phase identifies WHAT the binary is, not HOW it works.
bash# 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:
bash# 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
bash# 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 |
bash# 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
bash# Entry points rabin2 -q -j -e binary | jq . # Exports (for shared libraries) rabin2 -q -j -E binary | jq '.exports[] | {name, vaddr}'
bash# 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")) '
bash# 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]}) '
| 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 |
After triage, record structured facts:
json{ "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 } }
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"}[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)After triage, determine:
→ Proceed to binary-re-static-analysis for function enumeration → Or binary-re-dynamic-analysis if behavior observation is priority
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-21 | fail→fail | 11,137 | 7,587 | -32% | 1 | 1 | 0% | 2,074 | 3,413 | +65% | 0 | 0 | — |
case-01 | fail→pass | 13,660 | 10,634 | -22% | 1 | 1 | 0% | 2,564 | 4,428 | +73% | 0 | 0 | — |
case-02 | fail→pass | 17,955 | 19,231 | +7% | 1 | 1 | 0% | 3,230 | 3,982 | +23% | 0 | 0 | — |
case-03 | fail→pass | 12,127 | 12,452 | +3% | 1 | 1 | 0% | 2,358 | 4,607 | +95% | 0 | 0 | — |
case-04 | fail→pass | 5,447 | 4,235 | -22% | 1 | 1 | 0% | 970 | 2,907 | +200% | 0 | 0 | — |
case-14 | pass→pass | 5,371 | 2,954 | -45% | 1 | 1 | 0% | 954 | 2,575 | +170% | 0 | 0 | — |
case-05 | pass→pass | 10,493 | 5,371 | -49% | 1 | 1 | 0% | 1,952 | 3,091 | +58% | 0 | 0 | — |
case-06 | pass→pass | 9,535 | 6,096 | -36% | 1 | 1 | 0% | 1,597 | 3,238 | +103% | 0 | 0 | — |
case-07 | pass→pass | 12,848 | 8,047 | -37% | 1 | 1 | 0% | 2,444 | 3,619 | +48% | 0 | 0 | — |
case-08 | pass→pass | 3,703 | 2,798 | -24% | 1 | 1 | 0% | 688 | 2,563 | +273% | 0 | 0 | — |
case-20 | fail→fail | 16,751 | 10,300 | -39% | 1 | 1 | 0% | 3,226 | 3,945 | +22% | 0 | 0 | — |
case-09 | pass→pass | 5,237 | 3,242 | -38% | 1 | 1 | 0% | 934 | 2,667 | +186% | 0 | 0 | — |
case-10 | fail→fail | 7,543 | 1,908 | -75% | 1 | 1 | 0% | 1,236 | 2,437 | +97% | 0 | 0 | — |
case-11 | fail→pass | 13,145 | 5,107 | -61% | 1 | 1 | 0% | 2,108 | 3,007 | +43% | 0 | 0 | — |
case-12 | pass→pass | 8,411 | 4,219 | -50% | 1 | 1 | 0% | 1,387 | 2,870 | +107% | 0 | 0 | — |
case-13 | pass→pass | 11,281 | 4,292 | -62% | 1 | 1 | 0% | 1,231 | 2,922 | +137% | 0 | 0 | — |
case-15 | pass→pass | 10,393 | 4,226 | -59% | 1 | 1 | 0% | 1,851 | 2,814 | +52% | 0 | 0 | — |
case-16 | pass→pass | 15,071 | 6,548 | -57% | 1 | 1 | 0% | 2,658 | 3,352 | +26% | 0 | 0 | — |
case-17 | pass→pass | 7,837 | 2,611 | -67% | 1 | 1 | 0% | 1,240 | 2,551 | +106% | 0 | 0 | — |
case-18 | fail→pass | 7,211 | 2,559 | -65% | 1 | 1 | 0% | 1,102 | 2,531 | +130% | 0 | 0 | — |
case-19 | pass→pass | 7,665 | 5,676 | -26% | 1 | 1 | 0% | 1,172 | 3,014 | +157% | 0 | 0 | — |
case-22 | fail→fail | 12,806 | 6,082 | -53% | 1 | 1 | 0% | 2,112 | 3,172 | +50% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +27 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.