Gdb (GNU debugger) je debugging alat koji se koristi za analizu binarnih datoteka. Nudi funkcionalnost pauziranja programa u određenim trenucima izvođenja, pregled memorije, registara, stoga, gomile itd… Njime je moguće izvesti disassemble nad strojnim kodom, odnosno, učiniti binarnu datoteku čitljivom.
U svrhe debuggiranja programa, izvorni kod se može kompilirati tako da I sami izvorni kod bude dostupan unutar binarne izvršne datoteke postavljanjem tzv. debugging simbola unutar simboličke tablice binarne datoteke. Time je vidljiv kroz debugging alate poput gdb-a. Npr.
gcc –g –o example example.c // (kompiliranje izvornog koda pisanog u c-u u svrhe debuggiranja radi se zastavicom –g)
U slučaju analize binarne izvršne datoteke u svrhe binarne eksploatacije, ova opcija najčešće neće biti uključena zbog čega je potrebno razumjeti asemblerski jezik.
#Sintaksa za naredbe: naziv_naredbe(kratica)
Pokretanje gdb-a:
gdb <binarna_datoteka>
Korisnik je predstavljen s interaktivnim sučeljem programa Poruka: (No debugging symbols found in binarna_datoteka) je pokazatelj da datoteka nije kompilirana s –g, time izvorni kod neće biti dostupan.
Zadavanje intel sintakse:
echo “set disassembly-flavor intel” > ~/.gdbinit //Unutar shell-a
Primjeri: break main break *main + 12 break *0x4017ba b *main + 27
Pokretanje:
gdb main
Prikaz funkcije main:
disas main
Postavljanje breakpointa na adresu main + 49 (mov edi, 0x405098):
b *main + 49
Pokretanje programa:
r
Ispis vrijednosti registra edi:
i r edi //Rezultat je 0x407120
Izvođenje sljedeće instrukcije (mov edi, 0x405098)
ni
Ponovni ispis vrijednosti registra edi:
i r edi //Rezultat je 0x405098
Ispis funkcije provjeri_lozinku:
disas provjeri_lozinku
Postavljanje breakpointa na provjeri_lozinku + 58:
b *provjeri_lozinku + 107
Nastavak programa:
c
Username: “Username123”
Password: “mojalozinka123”
Ispis framea:
i f
Ispis memorije na stogu:
x/20xb $rsp
Ispis stringa na vrhu stoga:
x/s $rsp
Prekid proces:
k
Izlazak:
q