Le vulnerabilità delle stringhe di formato possono essere di aiuto nello sfruttamento dei sistemi protetti da ASLR, ma non da NX. Il motivo è perché le alcune vulnerabilità della stringa di formato consentono all'autore dell'attacco di leggere lo stack frame della funzione, che contiene la vulnerabilità della stringa di formato. Ciò consente all'aggressore di individuare gli indirizzi delle variabili locali a quella funzione leggendo il frame dello stack . ASLR randomizza l'indirizzo di base della pagina di memoria all'inizio dell'applicazione. Quindi su un sistema a 32 bit l'indirizzo sembra 0xYYYYZZZZ. In questo caso gli Y saranno randomizzati, ma gli Z sono un offset più prevedibile. (Idealmente) Se l'attaccante può leggere gli indirizzi di base randomizzati della stessa funzione che sta sfruttando con un buffer overflow, allora l'attaccante può essere sicuro al 100% dell'indirizzo di dove sarà il suo codice shell. Se non è nella stessa funzione, allora l'attaccante è meno sicuro dell'indirizzo del suo codice shell, ma può comunque aiutare lo sfruttamento. Dopo aver determinato l'indirizzo di dove sarà lo shellcode, il passo successivo è quello di corrompere il frame dello stack con un overflow del buffer e puntare l'EIP in questa posizione di memoria nota. Quale onestà è davvero inverosimile e non molti exploit usano questa tecnica. Questa tecnica è trattata in modo molto dettagliato in "Sfruttare il software come rompere il codice" e in "Hacking: The Art of Exploitation".
Ci sono altri modi per leggere gli indirizzi di memoria. Nel pwn2own di IE nel 2010 un ricercatore ha utilizzato un mucchio di overflow per sovrascrivere il terminatore nullo e leggere la memoria adiacente , ha quindi ottenuto l'esecuzione del codice con un puntatore pendente. Le vulnerabilità dei puntatori penzolanti sono davvero interessanti per i sistemi protetti da ASLR e stanno diventando più popolari per questo motivo.
Se guardi la maggior parte degli exploit che colpiscono Metasploit e i moduli di exploit . Vedrai che Return Oriented Programming (catene ROP) è l'arma preferita per sfruttare i buffer overflow nei sistemi moderni.