====Kupon==== Na liniji koja sadrži: printf(input) nalazi se ranjivost string format reada. Unutar polja kupon veličine 48 bajtova nalazi se flag. Dakle potrebno je ispisati vrijednost flag-a sa stoga pomoću string format reada. Zbog poretka definiranja varijabli kupon pa input, na samom stogu će na nižoj adresi biti polje kupon, a zatim polje input (ovo ponekad nije istina zbog optimizacije stoga, no u ovom slučaju poredak je sačuvan, za provjeru uvijek je moguće ručno pregledati stog pomoću gdb-a). To znači da će se nakon poziva nove funkcije polje kupon nalaziti na adresama iznad postavljenje return adrese te nove funkcije. Ta područja su u x64 calling konvenciji namijenjena argumentima 7 pa nadalje. Dakle, ako u polje input upišemo "%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p" prvih 5 %p će ispisati memorije unutar printf funkcije namijenjene za argumente 2-6, a preostalih 6 %p će ispisati sadržaj cijelog polja kupon (jer mu je veličina 48 bajtova, a jedan pointer je veličine 8 bajtova). Nakon ispisa danih adresa od 6. pointera pa nadalje jest sadržaj polja kupon. Taj sadržaj je potrebno provući kroz hex converter u tekst i time će se dobiti sadržaj polja kupon. ----- Napomena 1: Zbog little endian zapisa, %p format očekuje da su na nižim adresama bajtovi manjih potencija, a sami zapis stringa je poredan od niže adrese prema višoj zbog čega je svaki bajt stringa unutar pointera ispisan obrnutim redoslijedom. Posljedično tome završetak stringa (opisan s newline \n tj. \x0a u hex formatu) proguta 0 u ispisu pointera. Recimo da je ispis nekog pointer 0xa414141. Provlačenjem kroz konverter konvertirale bi se vrijednosti \xa4 \x14 \x14 \x10 što nije ispravno. Potrebno je nadodati 0 na početak danog pointera kako bi se ispisale ispravne vrijednosti: \x0a \x41 \x41 \x41. Primjer lokalnog ispisa rješenja: {{kupon.png}}