Format string attack: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
fix: accenti errati e ortografia
Riga 73:
Vogliamo leggere aree di memoria vicino a questo indirizzo ‘0x08480110’:
* Per prima cosa bisogna codificare l'indirizzo in una stringa a 32 bit secondo la regola little-endian.
* l'indirizzo "0x08480110" veràverrà 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 caraterecarattere esadecimale "0x10" nella posizione corrente.
 
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è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'''
Riga 85:
<source lang=c>int i;
printf ("12345%n", &i);</source>
Con questo parametro il numero di caratteri scritti prima di lui verraverrà 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.