Sino a 30 minuti fa' ero in centro...sul lung'arno (dall'italiano "lungo l'arno/lungo le rive dell'arno") a prendere un po' di fresco in compagnia di amici quando ad un certo punto mi sono rotto ed ho pensato...ora torno a casa e scrivo un articolo sul Buffer Overflow aka BOF...che sara' mai questa parolaccia ?
E' una semplicissima (nonchè nota da chiunque) vulnerabilita'...vi faccio un esempietto pratico in c pluz pluz e per quanto riguarda la spiegazione vi sara' tutto piu' chiaro in anticipo...
void main(){
char array[10];
char array_grosso[256];
for (int i = 0; i< 256 ; i++){
cin>>array_grosso[i];
}
strcopy (array,array_grosso);
}
Avete gia' capito vero...? Se noi abbiamo una stringa con un buffer di 10 elementi ed un'altra con un buffer di 256 significa che nella prima al massimo posso inserire 10 elementi e nella seconda al massimo 10...ma se io prendo in ingresso prima i 256 elementi della stringa grossa e poi con la strcopy li vado a copiare
all'interno della stringa piccola...la piccola nn puo' contenere tutti questi elementi e quindi a livello macchina accade che vengono sovrascritte delle zone in memoria nei dintorni dell'allocazione effettuata con la stringa piccola...quindi...ecco a voi...ladiez and gentlemen...il Buffer OverFlow !!!
Lo stack::.
Iniziamo ad elencare i noiosissimi ma fondamentali pre-requisiti...
La zona di memoria in cui vengono scritti gli elementi che vi ho citato prima e' nota come stack o pila che non e' altro che un contenitore fatto in questa maniera :
[___Stack___]
| oggetto 0 |
| oggetto 1 |
| . |
| . |
| . |
| oggetto n |
[___________]
Vediamo come viene ritrovato dalla macchina questo spazio di memoria...
Occorre fare una ripassatina di Assembly,di un paio di registri e di un paio di istruzioni...
Registro EBP::.
Indica dove inizia lo stack...nn la sua prima locazione ma il suo semplice inizio...come se,vedendo lo stack come una cassettiera, indicasse non il primo cassetto ma la base superiore della cassettiera.
[___Stack___] <--- EBP
| oggetto 0 |
| oggetto 1 |
| . |
| . |
| . |
| oggetto n |
[___________]
Registro ESP::.
E' colui che si occupa di ricordare l'indirizzo dello stack e ci permette di scorrerlo a piacimento.
[___Stack___]
| oggetto 0 |
| oggetto 1 |
| . |
| . | <--- EIP (puo' puntare qui) | . |
| oggetto n |
[___________]
Registro EIP::.
E' il registro che contiene le infoz sull'istruzione successiva che la CPU deve eseguire.
Istruzione CALL::.
Salva EIP in memoria e salta all'istruzione che si vuole eseguire modificando EIP.
Istruzione RET::.
Dopo una CALL, RET si occupa di riassegnare i valori precedentemente imamagazzinati nello stack sia ad EBP che ad EIP.
La vulnerabilita'::.
Partiamo da lontano...come ho appena detto...in occasione di una CALL la CPU si preoccupera' di salvare in memoria l'EIP in modo da poter riprendere (dopo la RET) l'istruzione immediatamente successiva alla CALL stessa.
E' quindi piuttosto evidente che sia la CPu ad occuparsi dell'imagazzinamento e ripristino dell'EIP visto che un software nn puo' modificare direttamente questo registro.Spetta al software, invece, il compito di ricordarsi
della posizione di EBP e quindi della posizione dello stack, nonchè di lasciare abbastanza spazio prima di esso...spazio che verra' utlizzato dalle variabili...
Vediamo un esempio operativo:
push ebp
mov ebp, esp
sub esp, numero_di_bytez_riservato_alle_variabili
La push salva il vecchio EBP;
La mov imposta EBP con l'indirizzo della base dello stack per la funzione;
La sub alloca lo spazio in bytez che verra' riservato alle variabili nella zona di stack compresa tra EBP ed EIP.
Risulta ora abbastanza intuitivo che se i dati inseriti superano il buffer,il software non tornera' al vecchio indirizzo ma bensi' nella posizione in cui si trova EIP,quindi...trovera' al suo interno i butez che erano stati inseriti in precedenza causando la sovrascrittura della memoria adiacente al buffer.
Effetti dei BOF::.
In realta' l'effetto e' solo uno...in presenza di un BOF si puo' eseguire del codice arbitrario e...la cosa risulta veramente interessante...
Conclusione::.
Ora siete a conoscenza di cosa sia un BOF e per quanto riguarda come utilizzarlo...beh...nn avevo promesso di parlarne...