offensive-tools/rev/radare2/SKILL.md
Auth/lab ref: CLI reverse engineering framework with disassembly, decompilation (r2ghidra/r2dec), debugging, ESIL emulation, scripting, and binary patching.
npx skillsauth add aeondave/malskill radare2Install this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
CLI RE framework — disassemble, decompile, debug, emulate, patch, and script binary analysis.
# Linux/macOS
git clone https://github.com/radareorg/radare2 && cd radare2 && sys/install.sh
# OR: apt install radare2
# Windows: download from https://github.com/radareorg/radare2/releases
# Decompiler plugins
r2pm -ci r2ghidra # Ghidra decompiler in r2
r2pm -ci r2dec # Alternative decompiler
# Open binary (read-only)
r2 ./binary
# Analyze all (auto-analysis)
> aaa
# List functions
> afl
# Disassemble function
> pdf @ main
# Decompile function (requires r2ghidra or r2dec)
> pdg @ main
# Print strings
> iz
# Quit
> q
| Command | Purpose |
|---------|---------|
| aaa | Full auto-analysis |
| aaaa | Experimental deep analysis |
| afl | List all functions |
| afn NAME ADDR | Rename function |
| s ADDR | Seek to address |
| pdf @ FUNC | Disassemble function |
| pdg @ FUNC | Decompile function (r2ghidra) |
| pdd @ FUNC | Decompile function (r2dec) |
| V | Visual mode |
| VV | Visual graph mode |
| p | Cycle view in visual mode |
| Command | Purpose |
|---------|---------|
| i | File info (format, arch, bits) |
| iS | List sections |
| ii | List imports |
| iE | List exports |
| iz | Strings in data sections |
| izz | Strings in whole binary |
| ir | Relocations |
| il | Libraries (linked) |
| iH | Binary header info |
| ie | Entrypoints |
| Command | Purpose |
|---------|---------|
| / STRING | Search string |
| /x HEXBYTES | Search hex pattern |
| /R OPCODE | Search ROP gadgets |
| /r ADDR | Find references to address |
| axt ADDR | Cross-references to address |
| axf ADDR | Cross-references from address |
| Command | Purpose |
|---------|---------|
| ood [args] | Reopen in debug mode |
| db ADDR | Set breakpoint |
| dc | Continue |
| ds | Step into |
| dso | Step over |
| dr | Show registers |
| dr rax=0 | Set register |
| dm | Memory map |
| dmi libc | Symbols in module |
| dtf FUNC FMT | Trace function with format |
| dts+ | Create trace session |
| dk %SIGNAL | Send signal |
| Command | Purpose |
|---------|---------|
| px N @ ADDR | Hex dump N bytes |
| ps @ ADDR | Print string |
| pf FMT @ ADDR | Print formatted (struct) |
| wa INSTR @ ADDR | Write assembly |
| wx BYTES @ ADDR | Write hex bytes |
| wt FILE SIZE @ ADDR | Write to file |
| Command | Purpose |
|---------|---------|
| aei | Initialize ESIL VM |
| aeim | Initialize ESIL memory/stack |
| aeip | Set ESIL PC to entrypoint |
| aes | Step one instruction in ESIL |
| aeso | Step over in ESIL |
| aer | Show ESIL registers |
| ae EXPR | Evaluate ESIL expression |
r2 malware.exe
> aaa
> afl~main # Grep for main in function list
> iz~http # Grep strings for http
> ii~Crypt # Grep imports for crypto
> pdf @ sym.main
> pdg @ sym.main # Decompile
# Compare two versions of a binary
radiff2 -g main original.exe patched.exe | xdot -
# Or inside r2:
r2 -m 0x10000 original.exe
> o patched.exe 0x20000
> c 256 @ 0x10000
r2 -d malware.exe
> aaa
> db sym.main
> dc # Continue to main
> db 0x401234 # Break at interesting address
> dc
> dr # Inspect registers
> px 64 @ rsp # Stack dump
> dm # Check memory map for injected regions
r2 -w ./binary
> s 0x401234
> pd 3 # Print 3 instructions to verify location
> wa nop; nop; nop # Patch with NOPs
> wa jmp 0x401300 # Or redirect flow
> wt patched.bin # Save to new file
> q
import r2pipe
r2 = r2pipe.open('./malware')
r2.cmd('aaa')
# Get function list as JSON
funcs = r2.cmdj('aflj')
for f in funcs:
print(f"{f['offset']:#x}: {f['name']} ({f['size']} bytes)")
# Get strings and filter
strings = r2.cmdj('izj')
for s in strings:
if any(kw in s['string'].lower() for kw in ['http', 'exec', 'cmd']):
print(f" {s['vaddr']:#x}: {s['string']}")
# Disassemble function as JSON
main_ops = r2.cmdj('pdfj @ main')
for op in main_ops.get('ops', []):
if 'call' in op.get('type', ''):
print(f" CALL at {op['offset']:#x}: {op.get('disasm', '')}")
r2.quit()
r2 -p myproject ./binary
> aaa
> Ps myproject # Save project
> q
# Later:
r2 -p myproject # Reopen with all analysis intact
| File | When to load | |------|--------------| | references/r2pipe-recipes.md | r2pipe Python scripting recipes | | references/debugging-guide.md | Debugging and ESIL emulation workflows |
development
Auth/lab ref: Unicorn Engine CPU-only emulation for shellcode, decryptors, custom VM handlers, instruction tracing, memory hooks, and register-level experiments.
development
Auth/lab ref: Renode board and SoC simulation for MCU/RTOS firmware, UART/GPIO/peripheral modeling, GDB remote debugging, REPL platforms, and RESC scripts.
development
Auth/lab ref: Qiling OS-layer binary emulation for PE/ELF/Mach-O/UEFI/shellcode with rootfs, syscall/API hooks, filesystem mapping, and runtime patching.
databases
Auth/lab ref: QEMU user-mode and full-system emulation for cross-arch binaries, firmware, kernels, disks, serial consoles, networking, and GDB stubs.