Format string attack: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Etichette: Sequenze di caratteri ripetuti da parte di un nuovo utente o IP Modifica visuale
Riga 40:
 
== Attacchi possibili ==
 
'''Crash del programma'''
 
Un modo molto semplice per mandare in crash un programma è passando alla funzione printf() una stringa formattata in questo modo: <source lang="c">printf("%s%s%s%s%s%s%s%s%s%s%s");</source>
 
Ogni "%s" cerca di visualizzare il contenuto delladi memoriaun dabuffer undi certocaratteri (una stringa) dall'indirizzo iniziale presente sullo stack fino al carattere terminatore ("0"). Inserendo quindi molti “%s", la funzione sposterà il puntatore in avanti fino ad aree di memoria non mappate nel frame dell'applicazione, così facendo cercherà di leggere da "indirizzi illegali", causando l'errore “''segmentation fault”'' che manda in crash il programma.
Inserendo quindi molti “%s”, la probabilità di andare a leggere da un “illegal address” (cioè un indirizzo non mappato per questa funzione) sono molto elevate e se succede, causeremmo l’errore “''segmentation fault”'' crashando quindi il programma.
 
'''Leggere lo stack'''
 
Utilizzando sempre la printf(), potremmoè andare apossibile leggere parte del contenuto dello stack, usando una format string di questo tipo:
<source lang="c">printf( "%08x-%08x-%08x-%08x-%08x\n");</source>
l'output potrebbe essere il seguente:
<source lang="c">4306ea40-43074920-0062de90-70706970-02000002</source>
Questo perché essendo il numero degli argomenti della printf() variabili, questa utilizza la format string per sapere quanti gliene sono stati passati. In questo caso quindi crede (erroneamente) che siano cinque parametri, e andrà quindi a stampare i prossimi cinque indirizzi sullo stack, pensando siamo i parametri richiesti.
Il parametro di formato "%08x" dice alla printf() di mostrare sei parametri salvati sullo stack visualizzando in formato esadecimale a 8 cifre.
 
Il parametro di formato "%08x" è costituito dai seguenti componenti: x (converti i carratteri in esadecimale), 8 (mostra otto caratteri), 0 (riempi di zeri i caratteri nulli, se presenti).
In certi casi potremmo anche essere in grado di ricostruire tutta memoria occupata dallo stack contenere importanti informazioni sul flusso del programma, sulle variabili locali di funzioni e su indirizzi permettendoci di calcolare l’esatto offset da usare per effettuare l’exploit.
 
'''Leggere memoria in ogni locazione di memoria'''
 
E’ possibile anche leggere aree di memoria diverse dallo stack. Dobbiamo però creare una format function che visualizza il contenuto della memoria all’indirizzo che gli forniamo.