Cestino sparito Vista
Oggi mi squilla il cellulare intorno alle 12.00, e mi viene comunicato: “Ciao,oh mi è sparito il cestino in windows vista”...Leggi tutto
Oggi stavo pensando all’exploit di buffer overflow per la Nintendo Wii che permette di installare il canale Homebrew, la cosa che mi sconvolge e che mi fa pensare è che il problema del buffer overflow è noto da anni ma puntualmente ogni giorno vengono scoperte nuove falle e vulnerabilità che si basano proprio su questa tecnica. Il buffer overlow è affascinante perché è parte della storia dell’informatica ed è l’exploit per eccellenza.. tutti gli smanettoni sognano di crearsi una shell root tramite questo baco..mi sono messo quindi a ripassare le basi di questa tecnica un po’ per curiosità e un po’ perché questo tipo di argomenti mi ha sempre affascinato.. inizio quindi una piccola guida sul buffer overflow, in questa prima puntata spiego in maniera molto semplice cos’è un buffer overflow e come si può sperimentare a casa questa situazione..
Cos’è un buffer overflow?
Il buffer overflow è un problema che si presenta quanto si caricano in memoria più informazioni di quelle che ci si aspetta. Il modo migliore per capire questa tecnica è tramite un esempio:
io scrivo un programma che prende in input da tastiera una stringa e mi aspetto che questa abbia una lunghezza massima di 10 caratteri, poi quando eseguo il programma invece di inserire una stringa di 10 caratteri ne inserisco 11, il sistema và in buffer overflow e il programma si chiude.
Questo è il più classico esempio di Buffer overflow..
Tutto ciò succede perché io nel scrivere il mio programma preparo un buffer destinato a contenere 10 caratteri e poi in fase di esecuzione ne inserisco 11 andando oltre lo spazio assegnato.. Questo succede perché io non effettuo un controllo sui dati di input… se nel mio programma ci fosse un controllo sul numero di caratteri inseriti non incapperei nell’errore di buffer overflow.
Quindi tanto per capirci il buffer overflow non è magia ma è un errore di programmazione.. in teoria qualsiasi programmatore nello scrivere del codice potrebbe incappare nel pericolassimo buffer overflow.
Questo problema quindi si può presentare ad ogni caricamento di dati, da quelli passati dall’utente dalla tastiera a quelli letti da file..se carico più dati di quelli previsti in determinate condizioni di programmazione si presenta l’errore di buffer overlfow.
Buffer overflow scolastico
Per capire come sfruttare il buffer overflow e per capire perché è tanto pericoloso bisogna scendere un po’ nel tecnico e bisogna capire ovviamente perché il programma soggetto a buffer overflow si chiude dopo aver restituito un errore di sistema. Servono quindi nozioni di C e di Assembly, niente di trascendentale, se avete un minimo di dimestichezza con i linguaggi di programmazione o con il C potete proseguire senza nessun timore.
Cominciamo col dire che il buffer overlflow è un problema che affligge i linguaggi di programmazioni come Il C,C++ e tutti i loro derivati e che si presenta con i buffer statici, cioè quelle di dimensioni predefinite inizializzati dal programmatore direttamente nel codice del programma. Tanto per capirci un array è un buffer statico perché in un semplice programma C bisogna dichiarare la sua dimensione,una stringa è un buffer statico perché devo dichiarare la sua lunghezza e così via…
Ora fatte queste premesse prendiamo in esame il seguente pezzo di codice C:
#include <stdio.h>
In main(void) {
char buffer[10]
gets (buffer);
printf(“%s\n”,buffer);
}
Queste semplice codice non fa altro che prendere in input da tastiera 10 caratteri e inserirli all’interno del buffer,senza effettuare nessun controllo sulla lunghezza della stringa di input, in pratica la funzione gets non si preoccupa di verificare se io abbia inserito più o meno di 10 caratteri.. prende l’input e lo inserisce nel buffer e poi ristampa la stringa inserita. Cosa succede quindi se io inserisco più di 10 caratteri? Scendiamo quindi ancora di un livello e vediamo come a livello di codice assembly viene organizzato questo semplice pezzo di codice.
Per prima cosa è fondamentale conoscere lo stack che è una locazione di memoria contigua che contiene i parametri di una funzione, le sue variabili locali,l’indirizzo dell’istruzione successiva e altre informazioni basilari per la corretta esecuzione del programma. Questo vuol dire che per ogni programma in esecuzione nella nostra macchina viene riservato uno stack la cui dimensione può crescere o diminuire a seconda del comportamento del programma.
In pratica quando lanciamo il nostro programmino semplice viene creato uno stack di questo tipo (e’ un modello semplificato per chiare cosa accade):
BUFFER[0]
BUFFER[1]
…
BUFFER[5] —- ESP
…
BUFFER[9]
EBP[0x000etc]
EIP[1x000etc]
Questo è lo stack del nostro programma semplice:
Quando inseriamo i nostri 10 caratteri , ad esempio la parola “croccobisc”,lo stack si riempie in questo modo (la seconda parentesi indica il contenuto della locazione di memoria):
BUFFER[0][C]
BUFFER[1][R]
BUFFER[2][O]
BUFFER[3][C]
BUFFER[4][C]
BUFFER[5][O]
BUFFER[6][B]
BUFFER[7][I]
BUFFER[8][S]
BUFFER[9][C]
EBP[0x000etc]
EIP[1x000etc]
Il buffer si è riempito correttamente e il registro EIP si preoccuperà di puntare all’istruzione successiva cioè quella di stampare la stringa.
Se invece di inserire la stringa “croccobisc” inserisco la stringa “croccobiscottohack” cosa succede?
lo stack si riempe in questo modo:
BUFFER[0][C]
BUFFER[1][R]
BUFFER[2][O]
BUFFER[3][C]
BUFFER[4][C]
BUFFER[5][O]
BUFFER[6][B]
BUFFER[7][I]
BUFFER[8][S]
BUFFER[9][C]
EBP[OTTO]
EIP[HACK]
Ecco quindi il classico buffer overflow, il programma ha sforato la dimensione a lui consentita andando a scrivere in un registro dello stack fondamentale EIP che contiene l’indirizzo dell’istruzione successiva.
Il programma quindi si chiuderà con un errore di “segmentation fault” perché esso tenterà di accedere ad un’area della memoria riservata perché il registro EIP punterà all’indirizzo di memoria 0x48x41x43x4B che altro non è che la conversione ascii lettera per lettera della parola HACK.
Dove sta quindi l’hack? Un attaccante potrebbe sfruttare un buffer overflow per inserire del codice malizioso e per far puntare il registro EIP proprio a questo codice eseguendo quindi una serie di istruzioni maligne…
Facile a dirsi un casino a farsi, quello che c’è sopra è solo il classico esempio scolastico, nella realtà la situazione è molto più complessa, nella prossima puntata di questo post proverò ad affrontare la tematica in maniera più tecnica con qualche esempio. Nel frattempo se volete esercitarvi o avete qualche correzione da farmi fatelo pure nei commenti!!
Vota l'articolo
Ti è piaciuto questo articolo? allora iscrivi alla newsletter, riceverai ogni nuovo post via mail!
Loading...Se preferiferisci i feed ricordati di iscriverti ai miei Feed! 
Grazie mille per la segnalazione, appena ho visto il messaggio ho subito modificato il testo del post, lascio un commento solo ora perchè prima non potevo grazie ancora ciaoo
Avete mai provato con BugFighter.
L’ho scoperto in questi giorni e mi ha aiutato a scoprire i buffer overflow nei vettori mono e multidimensionali.
L’ho scaricato da http://www.bugfighter-soft.com
Per esempio:
int y[5][5][5];
y[0][7][0] = 9;
ti dice che il secondo indice è errato.
Ciao a tutti
Splendida e semplicissima spiegazione! complimentoni!
Controlla il testo, c’è un pezzo che compare due volte: subito dopo “buffer overflow scolastico”