Reverse Engineering
Ghidra
- Ghidra source: https://github.com/NationalSecurityAgency/ghidra
- Ghidra page: https://ghidra-sre.org
Ghidra Scripts/Plugins/Extension:
- https://github.com/AllsafeCyberSecurity/awesome-ghidra
- https://github.com/AllsafeCyberSecurity/ghidra_scripts
Radare2
| What | Where |
|---|---|
| Official Page | https://www.radare.org |
| Source | https://github.com/radareorg/radare2 |
| Download | https://github.com/radareorg/radare2/releases/ |
| Install | sys/install.sh |
Cheat Sheet
load without any analysis (file header at offset 0x0): r2 -n /path/to/file
- analyze all:
aa - show sections:
iS - list functions:
afl - list imports:
ii - list entrypoints:
ie - seek to function:
s sym.main - open project:
Po <name> - save project:
Ps <name> - edit project notes:
Pn -
inspecting a function
- show basic block disassembly:
pdb - show function disassembly:
pdf - show function arguments:
afa - show function variables:
afv - rename function variable:
afvn - set function variable type:
afvt - add/analyze function:
af
visual mode
- enter visual mode:
V - select function, variable, xref:
v - quick command/seek:
_ <search string> - custom quick command list:
?? - update the list of commands by changing
$R2HOME/hud. - show cursor:
c - set function name:
d - add comment:
; - remove comment:
;-
graph mode
graph mode is not visual mode!
- enter graph modes:
VV - cycle types of graphs:
- forward:
p -
backwards:
P -
types of graphs:
- graph view
- graph view + opcode bytes
- esil
- esil + comments
-
overview
-
seek to function:
g<identifier> - undo seek:
u - define new function at cursor:
df - rename function at cursor:
dr - show comments:
' - add comment:
/ - add comment (complex):
:CC! - select bb:
??? - seek to next bb:
tab - seek to previous bb:
TAB - if bb has conditional branch:
- seek to True target:
t - seek to False target:
f
pipe,grep,etc
- exec multiple cmd:
; - pipeline cmd:
| - run shell cmd: '!' , and give output back to r2 buffer: '!!'
- grep:
<cmd>~<string>grep string from command output<cmd>~[n]grep also the 'n' column<cmd>~:ngrep also the 'n' row
analysis, assembly, memory
- analyze functions:
af - analyze stack:
ad@rsporad@esp - search for opcode:
/a - search for rop/jop/etc:
/R - search for bytes:
/x - get offset for the actual seek point address:
?p
Example usage
Some examples - view the links for details on the task.
tryhackme adventofcyber2
Example from doing this tryhackme challenge https://tryhackme.com/room/adventofcyber2 → "[Day 17] Reverse Engineering ReverseELFneering"
r2 -d ./challenge1
b+1024
e anal.bb.maxsize=2048
aa
afl | grep main
pdf @main
db 0x00400b62
px @rbp-0xc
ds
dr
px @rbp-0x8
Tryhackme introtox8664 and rfirmware
Just some notes from the tryhackme tutorials intro to x86-64 and Dumping Router Firmware
Open "if2" to analyses the program:
r2 -d if2
e asm.syntax=att
aaa
afl
Output:

Set breakpoint at popq %rbp
pdf @main
db 0x561d78dd863c
Output:

Start execution of the program:
dc
px @ rbp-0x8
px @ rbp-0x4
px @ rbp-0xc
Output:

Read value of var_ch, var_8h, var_4h before popq/retq as requested.
Task 5 open loop2
r2 -d loop2
e asm.syntax=att
aaa
afl
pdf @main
db 0x55ffc9760620 # sarl
dc
dc
Read at second loop
px @ rbp-0x8
px @ rbp-0xc
Read at end of loop
dc
px @ rbp-0x8
px @ rbp-0xc
task6 - crackme1
r2 -d crackme1
e asm.syntax=att
aaa
afl
pdf @main
px @ rbp-0x48 (var_48h)
px @ rbp-0x54 (var_54h) pw