GDB
Def :
GDB est un outil qui permet de faire du debugging sur un fichier executable.
Utilisation :
Pour ouvrir un fichier dans le gdb :
gbd ./<file>
Argurments :
Dans de nombreux CTF, il est nécessaire d'ajouter des arguments pour executer le programme :
gbd --args ./<fike> arg1 arg2 arg3
Dissas :
Ici on veut regarder le programme et ce à quoi il ressemble :
disass <func> //souvent ce sera main.
Breakpoints :
Il est possible de mettre des breakpoints dans le gdb pour s'arrêter
On peut donc ajouter un breakpoint à une ligne de la manière suivante :
b *0x08048414
Lorsque l'on va executer le fichier il va donc s'arrêter sur le breakpoint.
On peut consulter les infos des breakpoints et les supprimer :
info breakpoints
del 2
d 2
Hardware Breakpoints :
Pour ajouter un hardware break :
hb *0x080480d1
Parcourir le code :
Plusieurs options s'offrent à nous pour parcourir le code, en détail dans les foncitons ou non.
D'abord la première chose à faire est d'ajouter un breakpoint sur la fonction main ensuite on peut :
r
next //va à la prochaine instruction sans entrer dans les fonctions
step //entre dans les fonctions
nexti
stepi //une instruction à la fois et pas une ligne par une ligne
Pour voir la liste des fonctions du programme :
info functions
Observer le code :
Aussi avec un disass on peut voir où on en est dans le code :
Aussi on peut inspecter des choses en mémoire, tout autant que des registres.
Par exemple on peut inspecter comme dans l'exemple si dessus une adresse mémoire.
dec | hex | string | char | f |
---|---|---|---|---|
x/d | x/x | x/s | x/c | float |
Dans notre exemple on a un push de hello word, donc esp va pointer dessus. |
Modifier des valeurs :
Il est aussi possible de modifier en live des valeurs dans la mémoire, par exemple :
De manière générale la modification se fait de la sorte :
set *(<type>*)<address> = <value>
il faut ajouter une case mémoire à la fin au cas où pour les str, cela peut donner :
set *(int*)0x7fffffffeabc = 42 # Changes the value at address to 42
Registres :
Pour observer les registres à tout moment :
info registers
i r
Pour voir la stack frame :
info frame
Fonction supplémentaire :
Pour avoir des fonctions supplémentaires et une experience utilisateur plus sympa on utilise :
bash -c "$(curl -fsSL https://gef.blah.cat/sh)"