|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2011
Messaggi: 49
|
Vulnerabilità codice C
Salve vorrei sapere secondo voi che tipo di vulnerabilità ha questo codice C e se avete qualche consiglio su come fare per toglierla
Codice:
char buf[1024];
int i = 0;
char ch;
while((ch = getchar()) != ‘\n’) {
if(ch == -1) break;
buf[i++] = ch;
}
Ultima modifica di dany1900 : 23-05-2015 alle 16:09. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12936
|
Il codice si commenta da solo diciamo.
Si, è presente una vulnerabilità di tipo buffer overflow. Se sai cosa è il buffer overflow, allora sai anche qual è il problema di quel codice e come evitarlo Se ti serve altro siamo qui. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Devi comunque controllare che i non raggiunga 1024
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Nov 2011
Messaggi: 49
|
Diciamo non sono molto pratico,stavo leggendo del buffer overflow e ho pensato che potrebbe essere questo il caso,come lo modifichereste voi quel codice per evitarlo?
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Livorno
Messaggi: 1382
|
Codice:
char buf[1024];
int i = 0;
char ch;
while((ch = getchar()) != ‘\n’) {
if(ch == -1) break;
buf[i++] = ch;
if (i==1023)break; //<<---
}
Codice:
char buf[1024];
int i = 0;
char ch;
while((ch = getchar()) != ‘\n’) {
if(ch == -1) break;
buf[i++] = ch;
if (i==1023)i=0; //<<---
}
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2010
Messaggi: 1609
|
Le soluzioni proposte però sono entrambe non corrette. Infatti quando i vale 1022, l'istruzione buf[i++] porta i a 1023, quindi nella prima soluzione si esce prima del dovuto. La seconda, invece, riportando i a 0 elimina il buffer overflow, ma introduce la sovrascrittura dei primi caratteri del buffer e non è detto che questo sia un comportamento desiderato
__________________
Trattative nel mercatino: IronHead - fybpeppe - xcavax Utenti assolutamente DA EVITARE: devilred "Chi c**a sott' 'a neve, pure si ffa 'a bbuca e poi 'a copre, quanno 'a neve se scioje, 'a mm***a vie' sempre fori" T. Milian Ultima modifica di gianmpu : 24-05-2015 alle 13:51. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Io direi
Codice:
char buf[1024];
int i = 0;
char ch;
while((ch = getchar()) != ‘\n’) {
if((ch == -1) || (i == 1024)) break;
buf[i++] = ch;
}
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Nov 2011
Messaggi: 49
|
perche non riesco a farlo girare? tramite una printf volevo vedere cosa accade..ma non riesco a compilarlo..volevo simulare un po il tutto ma sto trovando un po di problemi
Praticamente l errore principale (e unico?) di quel codice è che i poteva superare il 1023 giusto? |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 3826
|
Quote:
Per risolverlo, appunto, è sufficiente la soluzione suggerita da lorenzo001; analoga situazione se, al posto del while, usassi un for. |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Solitamente, usando poi il buffer come stringa C standard, metto sempre il terminatore:
Codice:
char buf[1024];
int i = 0;
char ch;
while((ch = getchar()) != ‘'\n’) {
if((ch == -1) || (i == 1023)) break;
buf[i++] = ch;
}
buf[ i ] = '\0';
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 3826
|
Quote:
Non inserire il carattere terminatore è uno degli errori che molti fanno, con le conseguenze del caso... L'altro è fare a cazzotti con l'aritmetica dei puntatori |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12936
|
Il concetto è quello che devi sempre controllare di non star scrivendo oltre la dimensione del buffer.
Io lo scriverei così: Codice:
#define BUFFER_SIZE 1024
char buf[BUFFER_SIZE];
int i;
char ch;
for (i = 0; i < BUFFER_SIZE-1; i++) {
ch = getchar();
if (ch == '\n' || ch == -1) break;
buf[i] = ch;
}
buf[i] = '\0';
Nota che questo non è sempre vero e devi avere un compilatore abbastanza recente. Ultima modifica di WarDuck : 25-05-2015 alle 12:04. |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 3826
|
Quote:
|
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Se non è espressamente indicato, quel buffer non è detto che sia usato come stringa terminata con NULL.
Quindi non è strettamente necessario usare il NULL terminale. |
|
|
|
|
|
#16 |
|
Member
Iscritto dal: Dec 2013
Messaggi: 90
|
Codice:
#define BUFFER_SIZE 1024 char buf[BUFFER_SIZE]; int i = 0; while ( '\n' != (buf[i] = getchar()) && i < BUFFER_SIZE - 1) ++i; buf[i] = '\0' |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
No, ma chi impara comincia con del codice più semplice e comprensibile possibile ...
Se si vuole fare la gara a chi ce l'ha più criptico (il codice), allora è un'altra storia ... |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3010
|
Non solo chi comincia... se mi ritrovassi a cercare un problema in una riga così, alle sei di sera di un venerdì dopo sei anni che l'ho scritta (cambiando stile, linguaggi, perdendo diottrie) mi darei dello scemo con trasporto...
(ogni riferimento a fatti realmente accaduti è puramente casuale)
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...) |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 3826
|
Codice scritto in maniera criptica è sempre un problema, sia per chi inizia, sia per chi ha 30 anni di carriera alle spalle.
La leggibilità del codice, per quanto mi riguarda, deve essere un punto fondamentale nella realizzazione di qualsivoglia progetto, anche perché rende più facili modifiche future ed eliminazione dei bug. Ad esempio, nel famoso testo "Linguaggio C" di K&R si pone attenzione proprio sul non abusare della possibilità offerta dal linguaggio di "scrivere il meno possibile". |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:53.



















