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:
runoderr: Startet das Programm- CTRL-C: Unterbricht das Programm
backtraceoderbt: Zeigt den Stack anframe NO: Springt zum Frame mit der angegebenen Nummerdisassembleoderdisas: Disassembliert die Funktion für den aktuellen Stack-Framebreakoderb: Setzt einen Breakpoint. Hierbei können Sie angeben- Funktionsnamen:
break strcmp - Adresse:
break *0x7ffff7f39660
- Funktionsnamen:
continueoderc: Setzt das Programm fortx: Untersucht eine Speicherstelle, d.h. der übergebene Wert wird als Adresse interpretiert- als Hexadezimalwert:
x /x $rdioderx /x 0x555555559ac0 - als Dezimalwert:
x /d $rdioderx /d 0x555555559ac0 - als Fließkommazahl:
x /f $rdioderx /f 0x555555559ac0 - als String:
x /s $rdioderx /s 0x555555559ac0 - als Instruktionen:
x /i $ripoderx /i 0x555555559ac0 - es können mehrere Werte auf einmal ausgegeben werden, z.B.
x /10x $rdi
- als Hexadezimalwert:
printoderp: 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)