X
..«¿© CrôCcòBi$çöTtò ®¿».. » How-to » Buffer Overflow How-to

Buffer Overflow How-to

Mon, Sep 8, 2008 · 2,568 views · Print This Post Print This Post · Email This Post Email This Post

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:

  • ESP è un registro che ci consente di muoverci all’interno dello stack,per leggere o scrivere dati
  • EBP è il registro che contiene l’indirizzo di partenza dello stack in pratica è il puntatore alla base dello stack
  • EIP invece è il registro che contiene l’indirizzo all’istruzione successiva da eseguire

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

Newsletter e Feed

Ti è piaciuto questo articolo? allora iscrivi alla newsletter, riceverai ogni nuovo post via mail!

Loading...Loading...


Se preferiferisci i feed ricordati di iscriverti ai miei Feed! RssFeed

Articoli Simili
Leader

Php e directory

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...Leggi tutto

Leader

Xbox 360 JTAG hack How to

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...Leggi tutto

Leader

Modifica software Nintendo Wii

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...Leggi tutto

Leader

Come modificare la playstation 3

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...Leggi tutto

Leader

Aggiornare la Wii modificata al firmware 4.3

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...Leggi tutto

4 Commenti per “Buffer Overflow How-to”

Sep 08 2008
19:05

Controlla il testo, c’è un pezzo che compare due volte: subito dopo “buffer overflow scolastico” :)

1
Sep 10 2008
20:09

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

2
luca
Jul 16 2009
23:43

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

3
pdiablos
Oct 13 2009
10:39

Splendida e semplicissima spiegazione! complimentoni!

4

Lascia un comento per “Buffer Overflow How-to”





Copyright © 2010 · All rights reserved · WordPress · XHTML · Log in

84 queries. 2.041 seconds. 32.03 MB.