Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
* Buffer overflow c/c++
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
luca_c
Comune mortale
Comune mortale


Registrato: 30/06/09 23:10
Messaggi: 4

MessaggioInviato: 30 Giu 2009 23:14    Oggetto: * Buffer overflow c/c++ Rispondi citando

Ciao a tutti,
come si può individuare un buffer overflow nel c/cpp?

Se ho:

Codice:
int z[5];
int vettore[10][10][10];
...
vettore[0][11][1]  = 0;
...


Come faccio ad individuare questo l'indice errato visto che i compilatori non lo rilevano nè in fase di compilazione nè in fase di esecuzione?

Vi ringrazio
Top
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 30 Giu 2009 23:27    Oggetto: Rispondi citando

Beh, in c++ puoi usare il template "vector" però se usi gli array classici hai poco da fare (secondo me).
Al massimo puoi definire le dimensioni con delle define e nei cicli in cui assegni i valori controlli che l'indice sia minore della dimensione.
Top
Profilo Invia messaggio privato
luca_c
Comune mortale
Comune mortale


Registrato: 30/06/09 23:10
Messaggi: 4

MessaggioInviato: 30 Giu 2009 23:32    Oggetto: Buffer overflow c/c++ Rispondi citando

Ti ringrazio, ma il problema è proprio con gli array classici.

Se ho:
Codice:

int vettore[10][10][10];
int ii;

ii = rand();

vettore[10][ii][10] = 10;


controllare ogni singolo indice sarà un grosso problema.

Ti ringrazio
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11810
Residenza: Tokelau

MessaggioInviato: 01 Lug 2009 10:21    Oggetto: Rispondi citando

non credo che nel C ci sia neanche l'opzione del compilatore "array bound check" come esisteva ad esempio nel Pascal... per cui puoi affrontare il problema ad esempio creando una interfaccia verso ogni array/matrice che crei, anche se è un lavoraccio. Ad esempio se hai una matrice di interi Matrix[10][10] (per dire) potresti fare due funzioni tipo

Codice:
int GetMatrixValue(int i, int j)
void SetMatrixValue(int i, int j, int value)


nelle quali effettui verifiche prima di leggere da / scrivere nella matrice...

Mai visto fare prima in vita mia comunque Wink
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 01 Lug 2009 23:28    Oggetto: Rispondi citando

Se però il problema riguarda l'indice generato in modo random, basta generare il numero casuale nel range corretto.
Se invece il discorso è a livello più generale, beh, c'è poco da fare. O crei appunto un'interfaccia per usare i vettori, ma è un lavoraccio perchè dovresti farlo per ogni vettore.

Potresti usare gli array dinamici e allora potresti creare una struct formata da un puntatore e da il numero di elementi per ogni dimensione; sfruttando il fatto che le struct di C permettono l'uso di "pseudo-metodi" crei li dentro le interfacce. Però questa soluzione è proprio una cosa forzata.

Se vuoi a tutti i costi avere questi controlli, forse ti conviene andare sul C++ e usare il template vector.
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11810
Residenza: Tokelau

MessaggioInviato: 02 Lug 2009 11:12    Oggetto: Rispondi citando

un'altra idea scema è usare l'operatore % e il limite in ogni riferimento ad ogni array. Intendo ad esempio qualcosa del tipo

Codice:
#define MAXH 20
#define MAXV 32
int vettore[MAXH][MAXV];


e quando userai la variabile attraverso, ad esempio, i due indici i e j, farai

Codice:
vettore[i % MAXH][j % MAXV]


ovvio che magari non ottieni il valore che volevi ma almeno non avrai un overbound.

In ogni caso in C non l'ho mai visto fare, ribadisco. Il programma va scritto bene in modo che un overbound non possa accadere e fine Wink
Top
Profilo Invia messaggio privato HomePage
luca_c
Comune mortale
Comune mortale


Registrato: 30/06/09 23:10
Messaggi: 4

MessaggioInviato: 17 Lug 2009 00:29    Oggetto: Rispondi citando

Buongiorno,
ringrazio tutti per la disponibilità e per le vostre risposte.

Ho eseguita una ricerca per travare un compilatore o tool per individuare i buffer overflow in C/C++.

Sono riuscito a trovare un tool molto interessante che risolve questo problema.

L'ho scaricato da www.bugfighter-soft.com.

Il sito dichiara che è indipendente dal compilatore e dal sistema operativo su cui opera.

Credo che sia plausibile, in quanto non fa altro che creare del nuovo codice sorgente a partire a quello originario:
www.bugfighter-soft.com/images/BugFighter.jpg

Una volta compilato lo si lancia.

In effetti l'ho provato con il Visula C++ Express e con Dev, come mostrato nei loro esempi, e riesce effettivamente a scoprire i buffer overflow di vettori dichiariti staticamente ed anche di quelli contenuti nelle strutture.
Come dichiarato il programma ottenuto scrive su file l'errore individuato.

Riesce anche a scoprire i puntatori nulli.

Voi l'avete provato?

Grazie e buon lavoro
Top
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 17 Lug 2009 01:25    Oggetto: Rispondi citando

Grazie per la segnalazione!
Lo strumento sembra interessante.

Io e SverX però pensavamo che tu volessi gestire l'overflow nel senso di evitarlo e non tanto di scoprilo e da lì ti abbiamo consigliato alcune cose.

Sicuramente un tool del genere a chi programma in c e c++ fa comodo anche se credo che però un "wrapper" per gli array di c non sarebbe male!
Top
Profilo Invia messaggio privato
carloef
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 15/12/07 12:55
Messaggi: 146

MessaggioInviato: 16 Apr 2010 00:40    Oggetto: Rispondi citando

scusate forse il post è un po vecchio ma mi è arrivato sotto gli occhi solo ora
non capisco una cosa perchè mi sto cimentando da poco nella programmazione

cosa si intente per un buffer overflow di una matrice o di un vettore??
che si potrebbe uscire dagli indici??
ma se la condizione di uscita dal ciclo è corretta non dovrebbe...oppure non sto capando

mi illuminate??

grazie
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11810
Residenza: Tokelau

MessaggioInviato: 16 Apr 2010 15:33    Oggetto: Rispondi citando

nel caso più semplice: hai un array di n elementi numerati da 1 a n e cerchi di accedere all'elemento n+1.
Possono succedere varie cose, a seconda se:
- accedi in lettura o in scrittura
- il sistema operativo (e/o il processore) proteggono aree di memoria dedicate a processi diversi / aree dati diverse

quindi per esempio su Windows se cerchi di leggere un dato fuori dalla memoria del tuo processo avrai un errore e l'applicazione verrà chiusa. Invece su DOS tu potresti anche scrivere in una locazione di memoria qualsiasi e -ad esempio- fare piantare un altro programma o lo stesso sistema operativo.

(nota: alcuni linguaggi di programmazione permettono di attivare l'array bound check e quindi forzare l'interruzione del programma quando questo tentasse di accedere ad elementi fuori dai bordi...)
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 16 Apr 2010 18:54    Oggetto: Rispondi citando

carloef ha scritto:
scusate forse il post è un po vecchio ma mi è arrivato sotto gli occhi solo ora
non capisco una cosa perchè mi sto cimentando da poco nella programmazione

cosa si intente per un buffer overflow di una matrice o di un vettore??

Qui ti ha già risposto SverX
carloef ha scritto:

che si potrebbe uscire dagli indici??
ma se la condizione di uscita dal ciclo è corretta non dovrebbe...oppure non sto capando

mi illuminate??

grazie

In teoria è così ma appunto se hai un bug nel controllo degli indici?
E' opportuno evitare che per un i+1 di troppo si incarti il programma di un altro!
Poi vabbè, come SverX ha detto a seconda del sistema operativo si ottengono comportamenti diversi però i buffer overflow sono uno dei mezzi per bucare un sistema.
Top
Profilo Invia messaggio privato
luca_c
Comune mortale
Comune mortale


Registrato: 30/06/09 23:10
Messaggi: 4

MessaggioInviato: 26 Giu 2010 14:54    Oggetto: Rispondi

carloef ha scritto:
scusate forse il post è un po vecchio ma mi è arrivato sotto gli occhi solo ora
non capisco una cosa perchè mi sto cimentando da poco nella programmazione

cosa si intente per un buffer overflow di una matrice o di un vettore??
che si potrebbe uscire dagli indici??
ma se la condizione di uscita dal ciclo è corretta non dovrebbe...oppure non sto capando

mi illuminate??

grazie


Ciao Carloef,
se ti riferisci ad un esempio tipo:

int vettore[10][10][10];
...
for(ii = 0; ii < 10; ii++)
for(jj = 0; jj < 10; jj++)
vettore[ii][jj][0] = 5;

Non hai nessun buffer overflow, come giustamente hai detto.

Ma se si commette banale errore di digitizzazione tipo:

for(ii = 0; ii < 10; ii++)
for(jj = 0; jj < 10; jj++)
vettore[ii][jj][10] = 5;

si ha un buffer overflow in quanto si indicizza un elemento esterno alla matrice (vettore[9][9][10], con ii=9 e jj=9).

Ma anche nel caso di:

vettore[0][10][0] = 5;

in cui si indicizza comunque un elemento all'interno della matrice, si commette un errore (a meno che la cosa non sia voluta), in quanto si è superato il valore massimo del secondo indice, che dovrebbe essere 9 :

vettore[0][9][0] = 5;

Ciao
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 2 ore
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi