Format string attack: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Riga 74:
* Per prima cosa bisogna codificare l'indirizzo in una stringa a 32 bit secondo la regola little-endian.
* l'indirizzo "0x08480110" verà quindi ribaltato e separato da caratteri speciali diventando: "\x10\x01\x48\x08"
La codifica dell’indirizzo scelto in una stringa a 32 bit "\x10\x01\x48\x08" dove il carattere "\x10" inserito in una stringa dice al compilatore di mettere un caratere esadecimale "0x10" nella posizione corrente. Senza

Il carattere "\x" dice al compilatore di mettere il carattere esadecimanle "0x10" nella posizione corrente sullo stack. Altrimenti il valore ASCII salvato nella stringa sarebbe ‘1’ e ‘0’ i cui rispettivi valori ASCII sono ‘49’ e ‘48’, che risulterebbe errato.

Quindi la seguente invocazione andrà a leggere memoria dall’indirizzo che gli abbiamo fornito finchè non raggiunge un NULL byte. Incrementando l’indirizzo di memoria dinamicamente possiamo mappare l’intera memoria di processo!
 
'''Scrivere un intero in (qualsiasi) locazione di memoria'''
 
La printf() ha un altro parametro di formato molto interessante: "%n".
<source lang=c>int i;
printf ("12345%n", &i);</source>
Con questo parametro il numero di caratteri scritti prima di lui verra salvato nella variabile "i"!
Quindi usando lo stesso metodo implementato per visualizzare il contenuto della memoria, possiamo andare a scrivere un intero (praticamente) ovunque.
Basta sostituire "%n" al posto di "%s" ed il contenuto della cella "0x10014808" verrà sovrascritto. L'attaccante potrebbe quindi andare a cambiare certi flag che gli garantiscano il controllo o sovrascrivere celle con indirizzi di ritorno a nostro piacimento.