https://cheatography.com/fristle/cheat-sheets/closed-source-debugging-with-gdb/
Options for GCC
- PIE ( Position Independent Executable )
no-pie
- NX ( Pile non exécutable )
noexecstack
- RelRO ( Read Only relocations )
relro
- Heap exec ( Tas non exécutable )
- ASLR ( Distribution aléatoire de l’espace d’adressage )
-fno-stack-protector
- SF ( Source Fortification )
- SSP ( Stack-Smashing Protection )
(gdb) set disassembly-flavor intel
Lancement
Lancer gdb sur un programme
gdb <program>
Lancer gdb sur un programme avec des arguments
gdb --args <program> <args...>
(gdb) set args <args...>
Lancer le programme
(gdb) run <
(gdb) r
(gdb) r <args>
(gdb) r < <file>
Attacher gdb a un processus
gdb --pid <pid>
Gestion du flux d’éxecution
Ajouter un breakpoint
(gdb) break <where>
(gdb) break *address
(gdb) break function
(gdb) break +offset
(gdb) break -offset
# exécute jusqu'au prochain retour de la fonction
(gdb) finish
Supprimer un breakpoint
(gdb) delete <breakpoint#>
Supprimer tous les breakpoints
(gdb) clear
Activer/Désactiver un breakpoint
(gdb) disable <breakpoint#>
(gdb) enable <breakpoint#>
Surveiller l’accès à la mémoire
(avec un break point)
# en écriture
(gdb) watch *address
# en lecture
(gdb) rwatch *address
# en écriture et lecture
(gdb) awatch *address
Cela permet notamment de surveiller l’accès à une variable.
Informations
Lister les fonctions définies (liste des symboles)
(gdb) info functions
Afficher les informations de la pile :
(gdb) info frame
Afficher les registres
(gdb) info registers
Afficher les sections du fichier (entry point, .text, .data, etc..)
(gdb) info files
Désassembler / Analyser
Désassembler la fonction courante ou la position donnée
(gdb) disassemble <where>
(gdb) disassemble main
(gdb) disassemble 0x0000000000400520
Apparence / Flavour
(gdb) set disassembly-flavor att
(gdb) set disassembly-flavor intel
(gdb) show disassembly-flavor
Disassemble stripped main function :
(gdb) info files
//find address of beginning and end of the .text section
(gdb)disassemble 0x00000begining, 0x0000end
//the first call should link to the main function
( seaarch for libc_start_main )
Can’t find the main symbol :
https://stackoverflow.com/questions/5475790/how-to-disassemble-the-main-function-of-a-stripped-application
Afficher de la donnée
Afficher de la donnée en mémoire
(gdb) x/nfu <address>
Print memory.
n: How many units to print (default 1).
f: Format character (like „print“).
u: Unit.
Unit is one of:
b: Byte,
h: Half-word (two bytes)
w: Word (four bytes)
g: Giant word (eight bytes)
# display string
(gdb) printf "%s\n", *0xffffd134
# display data as hexadecimal
(gdb) printf "%x\n", *0xffffd134
Afficher la pile :
x/100x $sp
Correction / Patching
Remplacer un jne par je :
0x080486fa <+54>: test %eax,%eax
0x080486fc <+56>: jne 0x804870f <WPA+75>
(gdb) set {char}0x080486fc=0x74
(gdb) continue
De la même manière on peut remplacer un "jnz" (75 11) par un par "nop" (90 90) Par example : 85 C0 75 11 E8 29 devient 85 C0 90 90 E8 29 ainsi le test est ignoré
Others
Appel d’une fonction n’importe quand durant l’exécution :
$ gdb file01
(gdb) break main
Breakpoint 1 at 0x8048563
(gdb) run
Breakpoint 1, 0x08048563 in main ()
(gdb) call myfunction("toto", "toto")
Lancer un shell
(gdb) shell <commande>
(gdb) shell /bin/bash
Lire le contenu d’un fichier ouvert par le programme
Récupérer le pid du processus :
(gdb) info proc
process 99
cmdline = '/bin/nano'
cwd = '/lun/lab'
exe = '/bin/nano'
Lister les descripteurs de fichier ouverts :
(gdb) shell ls -l /proc/71/fd
lrwx------ 1 root root 0 Jun 11 01:23 0 -> /dev/tty1
lrwx------ 1 root root 0 Jun 11 01:23 1 -> /dev/tty1
lrwx------ 1 root root 0 Jun 11 01:23 2 -> /dev/tty1
lr-------- 1 root root 0 Jun 11 01:23 3 -> /secret.txt
Afficher le fichier
(gdb) shell cat /proc/71/fd/3
my super secret !!!
UTF 8 encoding: https://www.cogsci.ed.ac.uk/~richard/utf-8.cgi?input=%C3%A9&mode=char
AUTREEEE
#include <stdio.h>
int main() {
int data = 29;
printf("%x\n", data); // just print data
printf("%0x\n", data); // just print data ('0' on its own has no effect)
printf("%8x\n", data); // print in 8 width and pad with blank spaces
printf("%08x\n", data); // print in 8 width and pad with 0's
return 0;
}
1d
1d
1d
0000001d
Break-down:
8 says that you want to show 8 digits
0 that you want to prefix with 0's instead of just blank spaces
x that you want to print in lower-case hexadecimal.