Format string attack: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Funzionalità collegamenti suggeriti: 3 collegamenti inseriti. |
|||
(11 versioni intermedie di 11 utenti non mostrate) | |||
Riga 1:
{{S|sicurezza informatica}}
Le '''format string attack'''
== Introduzione ==
Il tipo di attacco Format String è una classe di vulnerabilità scoperte nel 1999, presenti prevalentemente in [[Linguaggio di programmazione|linguaggi di programmazione]] imperativi come il [[C (linguaggio di programmazione)|C]]. Un Format String Attack è formato da tre componenti fondamentali:
* Format Function: in ANSI C è una funzione che converte una variabile di tipo primitivo, in una
printf: per stampare su stdout
fprintf: per stampare la format string su file
Riga 12:
snprintf: per stampare esattamente 'n' caratteri della stringa in ingresso nella seconda
* Format String: è l’argomento della format function ed è una stringa ASCII che contiene sia testo che parametri di formato.
printf(“The magic number is %d\n”, 3);
Riga 22:
== Funzionamento dello stack ==
Lo stack
<
#include <stdio.h>
Riga 31:
printf("Valore var. B: %d - Indirizzo var. B: %x\n", B, &B);
}
</syntaxhighlight>
il programma stamperà:
<
Valore var. A: 3 - Indirizzo var. A: 7fdc
Valore var. B: 5 - Indirizzo var. B: 7fd8
</syntaxhighlight>
se invece la printf() riceve come parametro una stringa "maligna" (senza controllarne le caratteristiche) il risultato sarebbe proprio un attacco di tipo format string.
Riga 43:
'''Crash del programma'''
Un modo molto semplice per mandare in crash un programma è
Ogni "%s" cerca di visualizzare il contenuto di un buffer di caratteri (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.
Riga 50:
Utilizzando sempre la printf(), è possibile leggere parte del contenuto dello stack, usando una format string di questo tipo:
<
l'output potrebbe essere il seguente:
<
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
Il parametro di formato "%08x" è costituito dai seguenti componenti:
* x (converti i
* 8 (mostra otto caratteri),
* 0 (riempi di zeri i caratteri nulli, se presenti).
'''Leggere memoria in ogni locazione di memoria'''
La nostra format function mantiene all’interno dello stack il puntatore alla locazione di memoria del parametro di formato.
Utilizzando ad esempio la seguenti stringa di formato:[[File:StackMemory.png|miniatura|446x446px|Salvataggio variabili sullo stack]]<
la sequenza di "%08x" incrementa il puntatore interno della format function verso il top dello stack. Dopo alcuni di questi
Bisogna quindi sostituire la parte iniziale della format string con un vero indirizzo.
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"
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
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 '''Scrivere un intero in (qualsiasi) locazione di memoria'''
La printf() ha un altro parametro di formato molto interessante: "%n".
<syntaxhighlight lang=c>int i;
printf ("12345%n", &i);</syntaxhighlight>
Con questo parametro il numero di caratteri scritti prima di lui verrà 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.
== Voci correlate ==
* [[Cross Application Scripting]]
* [[
* [[
== Collegamenti esterni ==
* {{en}}scut / team teso [http://julianor.tripod.com/bc/formatstring-1.2.pdf Come sfruttare le
* {{cita web|https://www.securecoding.cert.org|CERT standard di programmazione sicura|lingua=en}}
* {{cita web|
* {{cita web|
{{Portale|
[[Categoria:Tecniche di attacco informatico]]
|