GDB | Cheatsheet

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.
Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *