====String format==== Format string read napad iskorištava dinamiku funkcija s formatiranim stringovima i načina na koji se argumenti dodjeljuju tim funkcijama. Uzmimo naprimjer funkciju printf: printf(„Hello %s, nice to meet you!”, username); %s označava „placeholder” koji će printf ispuniti zadanim argumentom username i zatim ispisati rezultat. Interno, printf prati svaki format (npr. %s, %d, %x, %p ...) i očekuje da je svaki potkrijepljen dodatnim argumentom kako bi ga popunio. Npr. printf(„%s %s\n”, first_name, last_name) mora sadržavati 2 dodatna argumenta uz početni string (dakle first_name i last_name) kako bi ispravno radio. Ranjivost: Ukoliko programer definira ispis varijable uz pomoć formatirane funkcije bez da zada ispravan broj argumenta, formatirana funkcija ne može razaznati radi li se o grešci ili ne zbog čega uzima argumente registara sačuvane na stogu ispod base pointera ili sa stoga iznad base pointera (argumenti 7 itd...) kako bi popunila zadane formate. Primjer: printf(„%p %p”); Ispisati će se sadržaji argumenata 2 i 3 (koji zapravno ne postoje, već će se uzeti s tih pozicija u memoriji: x64 konvencija, sami format string je sadržan unutar 1. argumenta) u formatu pointera: printf(format); //gdje je format definiran kao char *format = „%p %p” Ekvivalent gornjem primjeru, ispisati će se sadržaj u memoriji koji bi sadržavao argumente na 2 i 3 u formatu pointera. X64 konvencija na linuxu definira da se argumenti za funkcije nalaze redom: rdi, rsi, rdx, rcx, r8, r9 zatim stog (ukoliko je potrebno više od 6 argumenata) prije poziva. Unutar funkcije registri koji sadrže argumente pushaju se na stog nakon lokalnih varijabli. Zbog toga format string read napad omogućava napadaću da čita proizvoljan broj podataka sa stoga ukoliko je korisniku dopušteno definiranje format stringa. Maksimalan broj argumenata koje registri mogu sadržavati jest 6. RDI (prvi registar) sadrži sami format stringa („%p.%p....”). To znači da ukoliko se unese veći broj formata od 5, formatirana funkcija uzme 5 argumenata iz preostalih pozicija u memoriji namjenjene za argumente te ostale argumente sa stoga koji prethode base pointeru.