Format string: quando %n scrive in memoria
Passare input dell'utente come stringa di formato è il bug: printf(buf) invece di printf("%s", buf). I %x/%p dell'utente leggono valori dallo stack; %s dereferenzia; %n scrive il numero di byte stampati all'indirizzo puntato.
printf(buf); // buf = "%p %p %p %p" dumpa lo stack
// "%n" scrive -> primitiva di scrittura arbitrariaLa primitiva
Combinando l'accesso posizionale (%7$n) con il controllo del conteggio (larghezza del campo), si scrive un valore arbitrario a un indirizzo arbitrario: si sovrascrive una entry GOT o un return address.
Difesa
La stringa di formato deve essere sempre una costante. I compilatori avvisano (-Wformat-security); trattali come errori. %n è disabilitato in alcune libc hardened e in FORTIFY.