Precedente :: Successivo |
Autore |
Messaggio |
luca_c Comune mortale

Registrato: 30/06/09 23:10 Messaggi: 4
|
Inviato: 30 Giu 2009 23:14 Oggetto: * Buffer overflow c/c++ |
|
|
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 |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 30 Giu 2009 23:27 Oggetto: |
|
|
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 |
|
 |
luca_c Comune mortale

Registrato: 30/06/09 23:10 Messaggi: 4
|
Inviato: 30 Giu 2009 23:32 Oggetto: Buffer overflow c/c++ |
|
|
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 |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11810 Residenza: Tokelau
|
Inviato: 01 Lug 2009 10:21 Oggetto: |
|
|
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  |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 01 Lug 2009 23:28 Oggetto: |
|
|
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 |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11810 Residenza: Tokelau
|
Inviato: 02 Lug 2009 11:12 Oggetto: |
|
|
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  |
|
Top |
|
 |
luca_c Comune mortale

Registrato: 30/06/09 23:10 Messaggi: 4
|
Inviato: 17 Lug 2009 00:29 Oggetto: |
|
|
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 |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 17 Lug 2009 01:25 Oggetto: |
|
|
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 |
|
 |
carloef Eroe in grazia degli dei


Registrato: 15/12/07 12:55 Messaggi: 146
|
Inviato: 16 Apr 2010 00:40 Oggetto: |
|
|
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 |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11810 Residenza: Tokelau
|
Inviato: 16 Apr 2010 15:33 Oggetto: |
|
|
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 |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 16 Apr 2010 18:54 Oggetto: |
|
|
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 |
|
 |
luca_c Comune mortale

Registrato: 30/06/09 23:10 Messaggi: 4
|
Inviato: 26 Giu 2010 14:54 Oggetto: |
|
|
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 |
|
 |
|