Cours GDB du pauvre

Table of Contents

On essaye d’apprendre des trucs ouuuuuuuuuuuuuuuuuuuu

Installation de la caisse à outils

Pour tirer pleinement parti de GDB, il est utile d’avoir un écosystème complet d’outils et de dépendances, notamment pour la compilation, l’inspection des binaires, la visualisation mémoire, etc.

GDB

Ce cours étant consacré à GDB, l’outil essentiel dont vous avez besoin est naturellement GDB lui-même. GDB est le débogueur standard sous Linux pour les programmes natifs.

# Debian/Ubuntu
apt-get install gdb

# Arch Linux
pacman -S gdb

Usage

gdb ./program    # debug process
gdb -p pid       #debug running program with specifique pid
gdb -n ./program #désactive gdbinit

Outils de compilation et symboles de débogage

Outils de compilation pour la compilation programes.

# Debian/Ubuntu
apt-get install build-essential

# Arch Linux
pacman -S build-essential

Usage

gcc program.c -o program                         # compilation standard
gcc program.c -o program -Wall -Wextra -pedantic # mode difficile
gcc program.c -o program -ggdb                   # compile with gdb debug

GEF

Une surcouche destinée à rendre l’utilisation de GDB plus intuitive.

$ wget -O ~/.gdbinit-gef.py -q https://gef.blah.cat/py
$ echo source ~/.gdbinit-gef.py >> ~/.gdbinit

Utilisation de GDB

Commandes initiales utiles

run    # demarre le programme
starti # demarre le programme et break a la première instruction

Affichage et navigation

disass             # affichage du code assembleur
list               # affichage du code en c
set listsize count # change number of lines show by list
x/30i 0xaddresse   # disassemble 30 instruction from 0xaddresse

stepi              # prochaine instruction en assembleur
nexti              # prochaine instruction en assembleur (ne rentre pas dans les boucles)

step               # prochaine instruction en c
next               # prochaine instruction en c (ne rentre pas dans les boucles)

Breakpoint

break main                  # break sur main
break *0xaddress            # break sur l'instruction pointé par l'addresse
break *0xaddress if $eax=12 # break sur l'instruction pointé par l'addresse avec condition

watch  *(int *)0x600850
rwatch *(int *)0x600850
awatch *(int *)0x600850 

continue                    # continue l'éxecution du programme

Affichage

print variable    # affiche le contenue de la variable
print $rax        # affiche le contenue du registre rax

x/x 0xaddresse    # affiche la contenue a l'addresse addresse 
info registers    # affiche les registres

Appel de fonction

call (int)system("id")
jump *0xaddresse