0% found this document useful (0 votes)
307 views

r2 Cheatsheet

This document provides an overview of basic usage and commands for the Radare2 reverse engineering framework. It covers starting Radare2, general information on commands, scripting with Python, configuration, seeking, and searching.
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
307 views

r2 Cheatsheet

This document provides an overview of basic usage and commands for the Radare2 reverse engineering framework. It covers starting Radare2, general information on commands, scripting with Python, configuration, seeking, and searching.
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 2

Reversing with Radare2 Shell interaction Some variables

asm.pseudo enable pseudo-code syntax


Command output can be redirected to a file by appending >filename (in visual mode, toggle with: $)
Starting Radare or piped to an external command with |progname [args]. Examples: asm.bytes display bytes of each instruction
The basic usage is radare2 executable (on some systems you can use afl > all functions and afl | wc -l. asm.describe show opcode description
r2 instead of radare2); if you want to run radare2 without opening asm.cmtright comments at right of disassembly if they fit
External commands can be run with !!progname [args]. Note: if a
any file, you can use -- instead of an executable name. asm.emu run ESIL emulation analysis on disasm
command starts with a single !, the rest of the string is passed to cur-
Some command-line options are: asm.demangle Show demangled symbols in disasm
rently loaded IO plugin (only if no plugin can handle the command,
-d file|pid debug executable file or process pid it is passed to the shell).
-A analyze all referenced code (aaa command) bin.demangle Import demangled symbols from RBin
-R profile.rr2 specifies rarun2 profile (same as External commands can also be run with #!pipe, see below in Python
-e dbg.profile=profile.rr2) scripting. cmd.stack command to display the stack in visual
-w open file in write mode debug mode (Eg: px 32)
The output of external programs can be used as arguments for internal
-p prj use project prj
commands by using back-ticks to enclose the invocation of external dbg.follow.child continue tracing the child process on fork
-p list projects
commands; e.g. pdf echo 3 @ echo entry0.
-h show help message (-hh the verbose one)
io.cache enable cache for IO changes
Example: r2 -dA /bin/ls (AKA non-persistent write-mode)
Radare scripting
General information scr.utf8 show nice UTF-8 chars instead of ANSI
. filename interpret r2 script filename (Windows: switch code-page with chcp 65001)
The command ? prints the help. Command names are hierarchically
.! command interpret output of command as r2 commands scr.nkey select seek mode (fun, hit, flag); affects commands
defined; for instance, all printing commands start with p. So, to un-
n and N during visual mode
derstand what a command does, you can append ? to a prefix of such
scr.wheel enables mouse-wheel in visual mode
a command; for instance, to learn what pdf does, you can first try
pd?, then the more general p?.
Python scripting
Example: my ~/.radare2rc
Single-line comments can be entered using #; e.g. s # where R we?.
Assuming that Python extension has been installed (#! lists installed e asm.bytes=0
Command ? can also be used to evaluate an expression and print its extensions) an, interactive Python interpreter can be spawned with
result in various format; e.g. ? 5 * 8 + 2 (note the space between e scr.utf8=true
#!python and a script can be run with #!python script-filename. e asm.cmtright=true
? and the expression). There are also some special $-variables (list
all of them with: ?$?): Inside the spawned interpreter r2 is an r2pipe object that can be used e cmd.stack=px 32
to interact with the same instance of Radare, by invoking method cmd; e scr.wheel=false
$$ current virtual seek eco solarized
$b block size e.g. print(r2.cmd(pdf @ entry0)).
Where an address addx is expected, you can provide any expression In a script, and inside any Python interpreter (in)directly run with
that evaluates to an address, e.g. a function name or a register name. #!pipe cmd, the same behaviour can be obtained by importing r2pipe Searching: /
In this cheatsheet we sometimes use fn-name, instead of addx, to and inizializing r2 with r2pipe.open("#!pipe").
emphasize that the argument is supposed to be a function starting / str search for string str
address. As default address is (usually?) used the current seek: $$. You can make most Radare2 commands output in JSON format by /x hstr search for hex-string hstr
appending a j; e.g. pdfj (instead of pdf). /a asm-instr assemble instruction and search for its bytes
All commands that:
/R opcode find ROP gadgets containing opcode;
accept an optional size (e.g. pd), use the current block size by Method cmdj can de-serialize JSON output into Python objects; e.g. see: http://radare.today/posts/ropnroll/
default (see: b) f = r2.cmdj(pdfj @ entry0) It seems you need to be in debug mode to use this (?!?)
print f[name], f[addr], f[ops][0][opcode] Also: e??search for options
accept an optional address (e.g., pdf), use the current position
by default (see: s)
Configuration Seeking: s
Internal grep-like filtering s print current position/address
You can filter command output by appending ~[!]str, to display only e?? list all variable names and descriptions s addx seek to addx
rows [not] containing string str ; e.g. pdf~rdx and pdf~!rdx. You can e?[?] var-name show description of var-name s+ n seek n bytes forward
further filter by appending e var-name show the value of var-name s++ seek block-size bytes forward
e show the value of all variables s- n seek n bytes backward
:r to display row r (0 r < #rows or, backwards
eco theme-name select theme; eg. eco solarized s-- seek block-size bytes backward
with: #rows r 1)
eco list available themes s- undo seek
[c] to display column c (0 c < #cols)
b display current block size s+ redo seek
:r[c] to display column c of row r
b size set block size s= list seek history
Examples: afl~[0], afl~malloc[0], pdf~:2 and pdf~mov:2 env [name [=value]] get/set environment variables s* list seek history as r2-commands
Writing: w Debugging: d Seeking (in Visual Mode)
wa asm-instr assemble and write opcodes; for more instructions ?d opcode description of opcode (eg. ?d jle) . seeks to program counter
the whole command must be quoted: dc continue (or start) execution Enter on jump/call instructions, follow target address
"wa asm-instr1 ; asm-instr2 ; . . . " dcu addx continue until addx is reached u undo
w str write string str dcs [name] continue until the next syscall (named name, U redo
wz str write string str and append byte \x00 if specified) o go/seek to given offset
wx hex-pairs write hex-pairs dcr continue until ret (uses step over) 0 seek to beginning of current function
dr= show general-purpose regs and their values d (a non-zero digit) jump to the target marked [d]
Analysis (functions and syscalls): a dro show previous (old) values of registers ml (a letter) mark the spot with letter l
aaa analyze (aa) and auto-name all functions drr show register references (telescoping) l jump to mark l
afl list functions dr reg-name = value set register value n jump to next function
afll list functions with details drt list register types N jump to previous function
afi fn-name show verbose info for fn-name drt type list registers of type type and their values Debugging (in Visual Mode)
afn new-name addx name function at address addx db list breakpoints
afn new-name old-name rename function db addx add breakpoint b or F2 toggle breakpoint
asl list syscalls db -addx remove breakpoint F4 run to cursor
asl name display syscall-number for name doo args (re)start debugging s or F7 step-into
asl n display name of syscall number n ood synonym for doo S or F8 step-over
afvd var-name output r2 command for displaying the ds step into F9 continue
address and value of arg/local var-name dso step over Flags (AKA bookmarks): f
.afvd var-name display address and value of var-name dbt display backtrace
Note: in order to get your defined names appear in disassembly, you
afvn name new-name rename argument/local variable drx hardware breakpoints
must include a prefix (fun, sub, obj, . . . ); e.g. f obj.foo @ 0x1234
afvt name type change type for given argument/local dm list memory maps; the asterisk shows where
f name @ addx or
axt addx find data/code references to addx the current offset is
f name = addx associate name name to address addx
dmp change page permissions (see: dmp?)
Graphviz/graph code: ag f- @ addx remove the association at address addx
ag addr output graphviz code (BB at addr and children) Types: t f- name remove the association with name name
E.g. view the function graph with: ag $$ | xdot -
"td C-type-def " define a new type Comments: C
agc addr callgraph of function at addx CC list all comments in human friendly form
t t-name show type t-name in pf syntax
agC full program callgraph CCu text [@ addx ] set (update?) comment text at addx
.t t-name @ addx display the value (of type t-name) at addx
CC text [@ addx ] append comment text at addx
Information: i t list (base?) types
CC- [@ addx ] remove comment at addx
i show info of current file te list enums
ts list structs CC. [@ addx ] show comment at addx
ie entrypoint
tu list unions CC! [@ addx ] edit comment using cfg.editor (vim, . . . )
iz strings in data sections
to file parse type information from C header file
izz strings in the whole binary
tl t-name link t-name to current address
Projects: P
il libraries Pl list all projects
ii imports tl t-name = addx link t-name to address addx
tl list all links in readable format Ps [prj-name] save project prj-name
iS sections Po prj-name open project prj-name
Printing: p Visual mode: V Pd prj-name delete project prj-name
ps [@ addx ] print C-string at addx (or current position) Command V enters visual mode. Running in different environments: rarun2
pxr [n] [@ addx ] print n bytes (or block-size), as words, with q exit visual-mode rarun2 is used as a launcher for running programs with different envi-
references to flags and code (telescoping) at c cursor-mode, tab switches among stack/regs/disassembly ronment, arguments, permissions, directories and overridden default
addx (or current position) : execute a normal-mode command; e.g. :dm file-descriptors. Usage:
px [n] [@ addx ] hexdump p and P rotate forward/backward print modes rarun2 [-t|script-name.rr2] [directives] [--] [prog-name] [args]
pxh . . . hexdump half-words (16 bits) /str highlight occurences of string str rarun2 -t shows the terminal name, say , and wait for a connec-
pxw . . . hexdump words (32 bits) $ toggle pseudo-syntax tion from another process. For instance, from another terminal, you
pxq . . . hexdump quad-words (64 bits) O toggle ESIL-asm can execute rarun2 stdio= program=/bin/sh (use stdin/stdout to
pxl [n] [@ addx ] display n rows of hexdump ; add/remove comments (to current offset) redirect one stream only).
px/fmt [@ addx ] gdb-style printing fmt (in gdb see: help x x browse xrefs-to current offset rarun2 supports a lot of directives, see the man page.
from r2: !!gdb -q -ex help x -ex quit) X browse xrefs-from current function
pd [n] [@ addx ] disassemble n instructions browse flags Copyright 2017
c by zxgio; cheat-sheet built on August 21, 2017
pD [n] [@ addx ] disassemble n bytes d define function, end-function, rename, . . . This cheat-sheet may be freely distributed under the terms of the GNU
General Public License; the latest version can be found at:
pd -n [@ addx ] disassemble n instructions backwards V enter block-graph viewer
https://github.com/zxgio/r2-cheatsheet/
pdf [@ fn-name] disassemble function fn-name A enter visual-assembler
pdc [@ fn-name] pseudo-disassemble in C-like syntax n/N seek next/previous function/flag/hit (see scr.nkey)

You might also like