2.6 KiB
Der GNU Debugger (gdb)
Installation
Der GNU Debugger (gdb) ist auf den meisten Systemen bereits installiert. Sollte er bei Ihnen fehlen, können Sie ihn mit dem Kommando sudo apt install gdb
installieren.
Konfiguration
gdb
verwendet standardmäßig die AT&T-Syntax für die Ausgabe von Assembler-Befehlen. Da dies aber die unüblichere Form ist, werden wir ausschließlich die Intel-Syntax verwenden. Sie können gdb
nach jedem Aufruf mit dem Kommando set disassembly-flavor intel
auf die Intel-Syntax umstellen. Einfacher ist es jedoch, diese Einstellung dauerhaft abzulegen. Erzeugen Sie hierzu einfach eine Datei .gdbinit
in Ihrem Home-Verzeichnis und schreiben Sie dort das Kommando für die Syntax hinein.
$ echo "set disassembly-flavor intel" > ~/.gdbinit
Wichtige Kommandos
Sie laden ein Programm, indem Sie den Pfad zum Programm nach dem Aufruf von gdb
angeben, also z.B. $ gdb ./crackme
.
Wenn Sie gdb
gestartet haben, können Sie hinter dem Prompt (gdb)
Ihre Kommandos eingeben. Einige wichtige Kommandos sind:
run
oderr
: Startet das Programm- CTRL-C: Unterbricht das Programm
backtrace
oderbt
: Zeigt den Stack anframe NO
: Springt zum Frame mit der angegebenen Nummerdisassemble
oderdisas
: Disassembliert die Funktion für den aktuellen Stack-Framebreak
oderb
: Setzt einen Breakpoint. Hierbei können Sie angeben- Funktionsnamen:
break strcmp
- Adresse:
break *0x7ffff7f39660
- Funktionsnamen:
continue
oderc
: Setzt das Programm fortx
: Untersucht eine Speicherstelle, d.h. der übergebene Wert wird als Adresse interpretiert- als Hexadezimalwert:
x /x $rdi
oderx /x 0x555555559ac0
- als Dezimalwert:
x /d $rdi
oderx /d 0x555555559ac0
- als Fließkommazahl:
x /f $rdi
oderx /f 0x555555559ac0
- als String:
x /s $rdi
oderx /s 0x555555559ac0
- als Instruktionen:
x /i $rip
oderx /i 0x555555559ac0
- es können mehrere Werte auf einmal ausgegeben werden, z.B.
x /10x $rdi
- als Hexadezimalwert:
print
oderp
: Gibt einen Wert aus- eines Registers:
p $rdi
- eines Ausdrucks:
p 2*2
- Sie können auch die Flags
/x
- eines Registers:
- CTRL-D: Beendet den Debugger
Sowohl print
als auch x
unterstützen sogenannte Formatzeichen, die angeben, wie der Wert zu interpretieren und formatieren ist:
x
: Hexadezimald
: Vorzeichenbehaftete Dezimalzahlu
: Vorzeichenlose Dezimalzahlo
: Octalt
: Binära
: Adresse (hexadezimal + Offset zu nächsten bekannten Symbol)c
: ASCII-Zeichenf
: Fließkommazahls
: String (nurx
)