assignments/help/gdb.md

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 oder r: Startet das Programm
  • CTRL-C: Unterbricht das Programm
  • backtrace oder bt: Zeigt den Stack an
  • frame NO: Springt zum Frame mit der angegebenen Nummer
  • disassemble oder disas: Disassembliert die Funktion für den aktuellen Stack-Frame
  • break oder b: Setzt einen Breakpoint. Hierbei können Sie angeben
    • Funktionsnamen: break strcmp
    • Adresse: break *0x7ffff7f39660
  • continue oder c: Setzt das Programm fort
  • x: Untersucht eine Speicherstelle, d.h. der übergebene Wert wird als Adresse interpretiert
    • als Hexadezimalwert: x /x $rdi oder x /x 0x555555559ac0
    • als Dezimalwert: x /d $rdi oder x /d 0x555555559ac0
    • als Fließkommazahl: x /f $rdi oder x /f 0x555555559ac0
    • als String: x /s $rdi oder x /s 0x555555559ac0
    • als Instruktionen: x /i $rip oder x /i 0x555555559ac0
    • es können mehrere Werte auf einmal ausgegeben werden, z.B. x /10x $rdi
  • print oder p: Gibt einen Wert aus
    • eines Registers: p $rdi
    • eines Ausdrucks: p 2*2
    • Sie können auch die Flags /x
  • 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: Hexadezimal
  • d: Vorzeichenbehaftete Dezimalzahl
  • u: Vorzeichenlose Dezimalzahl
  • o: Octal
  • t: Binär
  • a: Adresse (hexadezimal + Offset zu nächsten bekannten Symbol)
  • c: ASCII-Zeichen
  • f: Fließkommazahl
  • s: String (nur x)