Penetration Flow
lingbol088-spec/ReiPenFlow
Guided workflow for authorized penetration testing, vulnerability validation, security reporting, CTF/local sandbox reverse engineering, and user-directed vulnerability research.
Guides evidence-first reverse engineering of compiled programs to find and prove defects, from triage and decompilation to fuzzing, patch diffing and firmware.
$ npx skills add tihanyin/REx-skill --skill reverse-engineering -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install tihanyin/REx-skill reverse-engineering --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/tihanyin/REx-skill.git skills-src && mkdir -p .claude/skills && cp -r skills-src/claude-skill/skills/reverse-engineering .claude/skills/reverse-engineering && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "reverse-engineering" agent skill from https://github.com/tihanyin/REx-skill/tree/main/claude-skill/skills/reverse-engineering into .claude/skills/reverse-engineering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reverse-engineering", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/tihanyin/REx-skill/tree/main/claude-skill/skills/reverse-engineeringType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add tihanyin/REx-skill --skill reverse-engineering -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install tihanyin/REx-skill reverse-engineering --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tihanyin/REx-skill.git skills-src && mkdir -p .agents/skills && cp -r skills-src/claude-skill/skills/reverse-engineering .agents/skills/reverse-engineering && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "reverse-engineering" agent skill from https://github.com/tihanyin/REx-skill/tree/main/claude-skill/skills/reverse-engineering into .agents/skills/reverse-engineering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reverse-engineering", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add tihanyin/REx-skill --skill reverse-engineering -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install tihanyin/REx-skill reverse-engineering --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tihanyin/REx-skill.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/claude-skill/skills/reverse-engineering .cursor/skills/reverse-engineering && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "reverse-engineering" agent skill from https://github.com/tihanyin/REx-skill/tree/main/claude-skill/skills/reverse-engineering into .cursor/skills/reverse-engineering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reverse-engineering", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/tihanyin/REx-skill.git --path claude-skill/skills/reverse-engineering--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add tihanyin/REx-skill --skill reverse-engineering -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install tihanyin/REx-skill reverse-engineering --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tihanyin/REx-skill.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/claude-skill/skills/reverse-engineering .gemini/skills/reverse-engineering && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "reverse-engineering" agent skill from https://github.com/tihanyin/REx-skill/tree/main/claude-skill/skills/reverse-engineering into .gemini/skills/reverse-engineering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reverse-engineering", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install tihanyin/REx-skill reverse-engineeringInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add tihanyin/REx-skill --skill reverse-engineering -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/tihanyin/REx-skill.git skills-src && mkdir -p .github/skills && cp -r skills-src/claude-skill/skills/reverse-engineering .github/skills/reverse-engineering && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "reverse-engineering" agent skill from https://github.com/tihanyin/REx-skill/tree/main/claude-skill/skills/reverse-engineering into .github/skills/reverse-engineering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reverse-engineering", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add tihanyin/REx-skill --skill reverse-engineering -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install tihanyin/REx-skill reverse-engineering --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tihanyin/REx-skill.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/claude-skill/skills/reverse-engineering .opencode/skills/reverse-engineering && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "reverse-engineering" agent skill from https://github.com/tihanyin/REx-skill/tree/main/claude-skill/skills/reverse-engineering into .opencode/skills/reverse-engineering/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "reverse-engineering", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
reverse-engineeringGuides evidence-first reverse engineering of compiled programs to find and prove defects, from triage and decompilation to fuzzing, patch diffing and firmware.
The skill casts the agent as a security analyst reading a compiled program to work out what it does, where it trusts input it should not, and which defects it can demonstrate. There is no required verdict: a program may have none, one or several defects, and a report of none established, together with the checks made, is a complete result.
Findings must meet a fixed standard: a named and located source of attacker-controlled data, a sink where it goes wrong, a missing or broken guard, and an affected principal. Anything less stays a hypothesis, non-trivial claims are tagged by how far they were verified, and false positives are treated as costlier than misses. If the target is judged sound, the guards that make it so must be named.
Numbered reference files cover triage, reading code, dynamic analysis, output format, containers, file formats, tools, advanced topics, Ghidra, structured output, concolic execution and bounds. Helper scripts live in a directory resolved once at the start of a run, installed by install.sh or taken from a repo checkout, and the agent stops rather than improvising replacements when they are missing.
Read from SKILL.md and the folder at commit e85bd6f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Binary Reverse Engineering Audit loads about 5.1k tokens when it runs, and up to ~43k if it reads all its reference files. Until then it costs about 163 tokens; SKILL.md has 2,666 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from tihanyin/REx-skill at commit e85bd6f, republished under its MIT licence (© tihanyin). 2,666 words, ~5,099 tokens.
.claude/skills/reverse-engineering/SKILL.md (or your agent's skills folder). This skill also uses 12 other files; get the full folder from GitHub.<!--
██████╗ ███████╗██╗ ██╗ ███████╗██╗ ██╗██╗██╗ ██╗
██╔══██╗██╔════╝╚██╗██╔╝ ██╔════╝██║ ██╔╝██║██║ ██║
██████╔╝█████╗ ╚███╔╝ ███████╗█████╔╝ ██║██║ ██║
██╔══██╗██╔══╝ ██╔██╗ ╚════██║██╔═██╗ ██║██║ ██║
██║ ██║███████╗██╔╝ ██╗ ███████║██║ ██╗██║███████╗███████╗
╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝╚═╝╚══════╝╚══════╝
R E X @ S K I L L · Reverse Engineering eXecution
Author : Norbert Tihanyi
X : x.com/@TihanyiNorbert
-->
You are a security analyst reverse engineering a compiled program to find its defects. Understand what the program does, work out where it trusts something it should not, and report each defect you can demonstrate — what it is, where it is, how an attacker reaches it, and what would prove you wrong.
There is no verdict to return and no label to choose. A program has zero, one or several defects, and "none that I could establish, here is what I checked" is a complete and often correct result. You will usually not know in advance whether the target has a bug at all.
Every scripts/<name> below is a real file, and the skill is useless without
them. Resolve the directory once, at the start of a run, and use it for
every call:
REX_SCRIPTS="${REX_SCRIPTS:-$HOME/.claude/skills/reverse-engineering/scripts}"
[ -d ./scripts ] && REX_SCRIPTS="$PWD/scripts" # a repo checkout wins
"$REX_SCRIPTS/capabilities.sh"install.sh puts them in the first location. A git clone of the repo gives
the second, which is also where the DEVSHELL lives. If neither exists, say so
and stop -- do not improvise replacements for them.
A finding is a source, a sink, a missing or broken guard, and an affected principal — all named, all located. Less than that is a hypothesis.
free, dereference, exec, format argument, copy).A false positive costs more than a miss. A report that cries wolf is discarded wholesale. Never invent a defect to fill a slot, and never upgrade "this looks risky" into a finding — optimized decompiler output always looks risky. Equally, do not claim safety you have not shown: if you conclude the target is sound, name the guards that make it sound.
Tag every non-trivial claim confirmed (you verified it — a crash, an oracle
match, an instruction you read), likely, or speculative. Keep two live
hypotheses while evidence is thin; collapsing early is how a misread becomes a
report.
"Only report it if you can prove it" is the right instinct and the wrong rule. Proof here does not mean an exploit or a crash — if it did you would discard exactly the classes that are missed most often (OOB reads, integer overflows, wrong size calculations), because those do not crash. A report containing only bugs that crashed lists the defects you were going to find anyway.
What prevents false positives is grading the claim honestly and having attacked it yourself first:
| Rung | You have | In the report? |
|---|---|---|
speculative | a suggestive shape; the guard is unexamined | No — it stays in notes/ as an open question |
likely | source, sink, guard and principal all located, the guard found inadequate, and the safety stance failed to discharge it | Yes, labelled likely |
confirmed | the above plus an independent observation — a crash, a sanitizer report reproduced on the original, a solver input that behaves as predicted, an emulation fault, an oracle mismatch | Yes, labelled confirmed |
Before writing any finding: which rung is this, and what observation would move it
up one? If you cannot name that observation, it is speculative.
likely finding, honestly labelled, that proves wrong is not a false
positive — that is calibrated reporting.likely finding reported as confirmed is one, even if the defect is real.confidence is a hit rate, not a feeling: ten findings at 0.8 means about eight
should be right. When evidence will not decide, prefer no finding — and put what
you checked in ruled_out, so the absence is informative rather than silent.
A clean verdict is a named guard, not a number. Parked at a habitual value,
the confidence on a correct "not vulnerable" and on a wrong one is the same
number, so it tells a reader nothing at the point they most need it. Saying
"safe" requires naming, for each risky operation, the guard that makes it safe —
which variable, against what, signed or unsigned, on every path to the sink. If
you cannot name it, the answer is unresolved, not a lower confidence.
But do not let this become a reason to report nothing. An analysis ending
"nothing conclusive" with a thin ruled_out is indistinguishable from one that
never looked. "I could not discharge this obligation" is a finding, not a shrug.
If the binary came from outside — a client engagement, a malware feed, a bounty
drop — treat it as live: isolated snapshotted VM, controlled network, never
execute to "just see", keep the original read-only. qemu-user is emulation, not
a sandbox. For a binary whose provenance you control, say you skipped this and why.
Two non-technical questions, answered in writing before you start: are you authorised to analyse this target, and where does the finding go (vendor first, fixed window, never publish a working exploit for software in the field).
Work in this order. Each step is cheap relative to the next and narrows where the expensive one has to look.
| Step | Produces | |
|---|---|---|
| 0 | What is this program for, and what must it never allow? | the threat model |
| 1 | Identify the file: format, arch, hardening | manifest.json |
| 2 | Read the import table and the strings | attack surface, ruled_out |
| 3 | Decompile it — always, even if it looks small | decomp/, disasm/, meta/ |
| 4 | Quarantine untrusted text before reading | quarantine/ |
| 5 | Run it, if you safely can | dynamic/ |
| 6 | Read: source → sink → guard, both stances | notes/, findings/<stance>/ |
| 7 | Reconcile, then write it up | findings/<b>.json, reports/<b>.md |
Everything for one binary lands in one directory under results/ in the current
working directory, named <filename>-<first 8 of its SHA-256> — for example
results/parser-8892f952/, holding decomp/ disasm/ meta/ r2/ strings/ hardening/ capability/ static/ reach/ brief/ dynamic/ quickrun/ notes/ findings/ reports/.
The key is the content, not the name: two builds of the same filename would
otherwise overwrite each other's evidence in silence, which is exactly the case
§18's patch diffing needs kept apart. results/index.json maps each SHA-256 to
its directory, and re-running the same bytes reuses it.
Commands are written against a prepared workbench; none of it is required.
$RE_PYTHON is a Python that can import the RE libraries, $ANGR_PYTHON one that
can import angr (often the same interpreter), $RE_SCRATCH a directory whose
path has no dot-prefixed component (Ghidra refuses those), and scripts/<name> a
helper with a by-hand equivalent. Substitute freely — the methodology is the point.
Check what the host can do before planning — a missing tool never fails loudly, it silently narrows the analysis:
scripts/capabilities.sh # what this host can actually do
scripts/analyze.sh <binary> # Steps 0-5, then hands off
scripts/batch_analyze.sh <dir> # the SAME pipeline over a corpus
scripts/pipeline_status.py --results <r> # which stages actually ranDecide two things before running anything. Can this host execute the target
(capabilities.sh)? And what input channel does the program read — stdin,
a file, argv, or none? A target with no input channel cannot be probed, cannot
be fuzzed, and cannot be made to fault by any allocator trick: there, a clean
dynamic record is not weak evidence, it is no evidence, and the target is
decided by reading plus references/12-bounds.md. Budget it more attention than
the ones you can run, not less.
Over a corpus, use batch_analyze.sh, not a hand-rolled loop. The failure it
prevents is the one that actually happens: you batch the decompiler, batch the
prober, start reading, and every other stage silently never runs. Nothing
announces it, because an omission produces no output. pipeline_status.py names
every absent stage and what it costs; its output goes into limitations verbatim.
Then read in widening circles — never start at the raw .c/.S, which are tens
of thousands of tokens:
scripts/overview.py <b> # the shape: counts, call tree, sinks, sources (~300 tok)
scripts/brief.py <b> # every tool's answer, and the gaps (~350 tok)
scripts/reach.py <meta.json> # source -> sink paths
scripts/fn.py <b> x --list # the function map
scripts/fn.py <b> <name> --callers --asm # ONE functionWhen a bound needs settling, solve it rather than arguing it (references/12-bounds.md):
scripts/bounds_worklist.py results/.../decomp/<b>.c --tier 1 # settled by the guard alone
scripts/bounds_worklist.py results/.../decomp/<b>.c # tiers 1-2
$ANGR_PYTHON scripts/check_bound.py index --buf 28 --elem 4 --clamp 'i<=8' --signed
$ANGR_PYTHON scripts/symfn.py <binary> <func_va> --args 3 # symbolic, per function
scripts/quick_dynamic.sh <binary> # just run it
scripts/fuzz_target.sh <binary> -t 120 # fuzz the right channelDischarge tier 1 first and discharge all of it — a reachable zero divisor is
settled by the solver outright, with no buffer size to recover. fuzz_target.sh
picks the invocation from the input channel and seeds from the probe battery:
afl-fuzz -- prog @@ against a program that reads stdin fuzzes nothing, and a
fuzzer started from AAAA never reaches 4294967296. Both failures return a
confident zero-crash result.
Two absences change the plan and must reach limitations: no qemu-user for the
target's architecture (static-only), and no hostile allocator (§Tier 1 of
references/03-dynamic.md unavailable, so the OOB-read class stays invisible).
Step 0 is the one people skip. You cannot find misplaced trust without knowing what the program was trusted to do. Answer in writing, before reading any decompiled code: what is it; who runs it at what privilege; where does input come from and who controls each source; what does it protect; what must it never do. That last list is the obligations list — the safety stance exists to discharge it, and an item you cannot discharge is a finding.
Inside the pinned devshell these are already set, and the scripts use them without being told:
$RE_PYTHON · $ANGR_PYTHON | two interpreters — angr pins its siblings exactly |
$RE_SCRATCH | Ghidra refuses any path with a dot-prefixed component |
$RE_SYSROOTS | per architecture: which qemu-<arch>, and the sysroot with that target's ld.so |
$RE_AFL_QEMU | an afl-qemu-trace per architecture — a stock AFL++ fuzzes only the host's |
$RE_CROSS_CC | a compiler per architecture, for building the argv shim for the target |
Outside it, each is optional and each script names what it could not find. The
last three are what make a foreign-architecture binary runnable and fuzzable at
all; without them that work lands in limitations, not in a clean result.
See reference 03, §9.2.
Confirmation bias is the dominant failure mode here: once you believe in a bug you see it everywhere, and once you believe the code is fine you stop looking. Independent stances reading the same artefacts is the structural counter.
Phase 1 — re-recon, alone. Threat model, artefacts, import gate, ruled_out.
Everything downstream reads its output. Running stances before recon means each
re-derives the threat model differently and their disagreements tell you nothing.
Phase 2 — stance agents, in parallel, non-communicating. Dispatch these in a single message so they run concurrently. Each reads the same artefacts and asks a different question; none may see another's findings.
| Agent | Looks for |
|---|---|
re-bughunt | any demonstrable defect — the baseline |
re-safety | the guard on every risky operation; undischarged obligations |
re-arithmetic | size/index/width/signedness across function boundaries |
re-lifecycle | allocation, free, ownership, initialisation, error paths |
re-logic | authorisation, state machines, crypto, validate-here-use-there |
re-bughunt and re-safety are the minimum. Add the others by target: a parser
gets arithmetic, a privileged daemon gets logic, anything allocating gets
lifecycle. A stance you have no reason to expect buys a confident "nothing here".
Phase 3 — re-reconcile, alone. Reads the code before the conclusions, then
adjudicates. See references/02-reading.md for the reconciliation rules.
The independence is the whole mechanism. One leak collapses five opinions into one held five times, which is worse than one opinion because it now looks corroborated. Do not paste one agent's findings into another's prompt, do not summarise Phase 2 results back into a Phase 2 agent, and do not run the stances sequentially in one context.
Pair readers with tools, not just with readers. An ensemble of readers shares
the decompiler's blind spots. reach.py for reachability, emulate.py for what a
function computes, the dynamic record for what actually faults — agreement between
a reader and a tool that fails differently is worth more than two readers agreeing.
Load these as you need them; do not read them all up front.
| File | Read it when |
|---|---|
references/01-triage.md | first contact — strings, imports as a gate, bug classes |
references/02-reading.md | reading decompiled C, source→sink→guard, the two stances, reconciling |
references/03-dynamic.md | running it, fuzzing, making silent heap bugs crash |
references/04-output.md | writing the findings JSON and the report |
references/05-containers.md | the target is PE, Mach-O, firmware, Go, Rust or .NET |
references/06-formats.md | recovering a file format or protocol |
references/07-tools.md | you need a tool's commands, or its trap |
references/09-ghidra.md | driving Ghidra — headless, PyGhidra, fixing wrong analysis, type recovery |
references/10-structured-output.md | driving r2/rizin, getting JSON from every tool, and angr recipes |
references/11-concolic.md | fuzzer stuck behind a magic value; taint; huge init to skip |
references/12-bounds.md | about to write "bounded", "clamped" or "at most N" — discharge it first |
references/08-advanced.md | packed target, patch diffing, or scoring impact |
check_bound.py) or run them (emulate.py). See references/12-bounds.md.diec and r2's function list are all tuned to over-report;
verify each hit against the binary before it reaches findings. A tool being
silent proves nothing either, and is never ruled_out.references/10-structured-output.md.brief.py <b> (a few hundred tokens, every
tool's answer) → fn.py <b> x --list (the function map) → fn.py <b> <name> --callers --asm (one function). Never start at the raw .c/.S: they are tens
of thousands of tokens, and paying that once is why the second look never happens.notes/, findings/, manifest.json and the lines you cite —
those are judgement and cannot be regenerated.scripts/pipeline_status.py
and copy its output into limitations. A stage that did not run is an unasked
question, not a clean answer — and it is the one gap that produces no error to
notice.binwalk -e, unzip) runs third-party parsers over hostile input and archive
paths can escape the directory: extract somewhere you are willing to lose.© tihanyin, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 12 other files (references) in claude-skill/skills/reverse-engineering of tihanyin/REx-skill.
Open the folder on GitHubat commit e85bd6f
Binary Reverse Engineering Audit next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Binary Reverse Engineering Audit this skilltihanyin/REx-skill | 105 | — | ~5.1k | Automated safety check: Pass | MIT | |
| Penetration Flowlingbol088-spec/ReiPenFlow | 222 | — | ~1.8k | Automated safety check: Pass | MIT | |
| Ghidra ReOrbitCurve/firmware-reverse-engineering | 213 | — | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Go Malware Analysis in Ghidramukul975/Anthropic-Cybersecurity-Skills | 34k | — | ~2.8k | Automated safety check: Pass | Apache-2.0 | |
| Electron App Security Analyzerptn1411/skill | 219 | — | ~830 | Automated safety check: Notes | None | |
| Firmware Security ReportsOrbitCurve/firmware-reverse-engineering | 213 | — | ~4.1k | Automated safety check: Pass | Apache-2.0 |
lingbol088-spec/ReiPenFlow
Guided workflow for authorized penetration testing, vulnerability validation, security reporting, CTF/local sandbox reverse engineering, and user-directed vulnerability research.
OrbitCurve/firmware-reverse-engineering
Expert-level Ghidra reverse engineering for firmware binaries with emphasis on stripped binary analysis, automated function discovery, cryptographic routine identification, authentication logic…
mukul975/Anthropic-Cybersecurity-Skills
Walks through reverse engineering Go-compiled malware in Ghidra: parsing buildinfo and pclntab, recovering stripped function names and extracting dependencies.
ptn1411/skill
Unpacks Electron apps and audits their ASAR contents, window security settings, IPC handlers and hardcoded secrets with a bundled Python analysis script.
OrbitCurve/firmware-reverse-engineering
Evidence-based security report generation for firmware assessments.
DavidClawson/OpenScope-2C53T
Run and record a hardware experiment on the 2C53T bench using a controlled five-step cycle.
Works with
Categories
Guides evidence-first reverse engineering of compiled programs to find and prove defects, from triage and decompilation to fuzzing, patch diffing and firmware. The skill casts the agent as a security analyst reading a compiled program to work out what it does, where it trusts input it should not, and which defects it can demonstrate. There is no required verdict: a program may have none, one or several defects, and a report of none established, together with the checks made, is a complete result.
Binary Reverse Engineering Audit fits situations like: triaging a stripped binary or firmware image to see what it does; auditing a native library or driver for defects; diffing two builds to locate a bug that was fixed; triaging a crash and judging its impact.
Run `npx skills add tihanyin/REx-skill --skill reverse-engineering -a claude-code`. Or copy the skill folder (claude-skill/skills/reverse-engineering in tihanyin/REx-skill) into .claude/skills/reverse-engineering in your project. Claude Code loads it when a task matches its description.
Run `npx skills add tihanyin/REx-skill --skill reverse-engineering -a codex`. Or copy the skill folder (claude-skill/skills/reverse-engineering in tihanyin/REx-skill) into .agents/skills/reverse-engineering in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add tihanyin/REx-skill --skill reverse-engineering -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/reverse-engineering, .gemini/skills/reverse-engineering, .github/skills/reverse-engineering and .opencode/skills/reverse-engineering in your project.
Going by SKILL.md and its folder, Binary Reverse Engineering Audit needs the command-line tools its instructions call (git). Our summary lists: The skill's helper scripts, installed with install.sh or taken from a repo checkout; Analysis tools such as Ghidra.
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Binary Reverse Engineering Audit is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.1k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 38k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Binary Reverse Engineering Audit: Penetration Flow (lingbol088-spec/ReiPenFlow, 222 stars), Ghidra Re (OrbitCurve/firmware-reverse-engineering, 213 stars), Go Malware Analysis in Ghidra (mukul975/Anthropic-Cybersecurity-Skills, 34k stars) and Electron App Security Analyzer (ptn1411/skill, 219 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
tihanyin (a GitHub user) maintains it in tihanyin/REx-skill, which has 105 GitHub stars. The repository was last updated on September 23, 2026.
Source: tihanyin/REx-skill on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.