Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati?
Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati?
Dopo più di un anno dal primo test drive ci siamo rimessi al volante della Renault 5 E-Tech Electric, questa volta utilizzandola come prima auto per circa due settimane. Scoprite con noi se il progetto convince ancora
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
Un proiettore economico, che fa della portabilità e immediatezza i suoi punti di forza. Adatto per una camera da letto o per la casa vacanze, è basato su sistema proprietario Linux ma offre piena compatibilità ufficiale a Netflix
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
Un notebook sviluppato in collaborazione con GoPro ma che risponde al meglio alle necessità di tutti coloro che creano contenuti video: robustezza, design, potenza di calcolo e funzionalità si abbinano al meglio tra di loro, pur se a prezzo di un costo elevato per via della tanta memoria onboard
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-05-2015, 15:06   #1
dany1900
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 io stavo pensando al buffer overflow però vorrei piu info possibili

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 15:09.
dany1900 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2015, 16:07   #2
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13028
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.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2015, 16:30   #3
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Devi comunque controllare che i non raggiunga 1024
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2015, 10:54   #4
dany1900
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? la domanda era appunto questa
dany1900 è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2015, 11:07   #5
das
Senior Member
 
Iscritto dal: Jan 2001
Città: Livorno
Messaggi: 1388
Codice:
char buf[1024];
int i = 0;
char ch;
while((ch = getchar()) != ‘\n’) {
 if(ch == -1) break;
 buf[i++] = ch;
 if (i==1023)break; //<<---
}
oppure a tuo piacimento:
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; //<<---
}
das è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2015, 12:44   #6
gianmpu
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 12:51.
gianmpu è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2015, 13:40   #7
lorenzo001
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;
}
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2015, 14:43   #8
dany1900
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?
dany1900 è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2015, 16:58   #9
GTKM
Senior Member
 
L'Avatar di GTKM
 
Iscritto dal: Jan 2014
Messaggi: 3826
Quote:
Originariamente inviato da dany1900 Guarda i messaggi
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?
Il problema principale era che non facevi un controllo sulla posizione dell'indice dell'array durante l'esecuzione del ciclo (il che significa, in pratica, che, ad un certo punto, l'array si sarebbe riempito e "saresti andato oltre").

Per risolverlo, appunto, è sufficiente la soluzione suggerita da lorenzo001; analoga situazione se, al posto del while, usassi un for.
GTKM è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2015, 20:33   #10
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Quote:
Originariamente inviato da dany1900 Guarda i messaggi
perche non riesco a farlo girare?
Cioè? Cosa fai? Cosa succede?
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2015, 22:22   #11
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
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...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2015, 23:00   #12
GTKM
Senior Member
 
L'Avatar di GTKM
 
Iscritto dal: Jan 2014
Messaggi: 3826
Quote:
Originariamente inviato da Gimli[2BV!2B] Guarda i messaggi
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';
Devi farlo sempre
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
GTKM è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2015, 11:02   #13
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13028
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';
E' immediato capire che questo codice è corretto, e scrivendolo in questo modo il compilatore ti può venire in aiuto se attivi i flags -Wall -Wextra, segnalandoti eventuali anomalie sugli indici a tempo di compilazione.

Nota che questo non è sempre vero e devi avere un compilatore abbastanza recente.

Ultima modifica di WarDuck : 25-05-2015 alle 11:04.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2015, 16:13   #14
GTKM
Senior Member
 
L'Avatar di GTKM
 
Iscritto dal: Jan 2014
Messaggi: 3826
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
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';
E' immediato capire che questo codice è corretto, e scrivendolo in
questo modo il compilatore ti può venire in aiuto se attivi i flags
-Wall -Wextra, segnalandoti eventuali anomalie sugli indici a tempo di
compilazione.

Nota che questo non è sempre vero e devi avere un compilatore abbastanza
recente.
Concordo, questo è il modo corretto di scrivere quel codice.
GTKM è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2015, 18:58   #15
lorenzo001
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.
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2015, 01:55   #16
vbextreme
Member
 
L'Avatar di vbextreme
 
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'
ma così era brutto?
__________________
Easy framework per il linguaggio C.
vbextreme hack your life
vbextreme è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2015, 11:36   #17
lorenzo001
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 ...
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2015, 13:05   #18
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
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...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 30-05-2015, 15:58   #19
GTKM
Senior Member
 
L'Avatar di GTKM
 
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".
GTKM è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati? Renault 5 elettrica al giudizio definitivo: solo...
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix HONOR CHOICE Projector Air Pro: piccolo, portati...
ASUS ProArt GoPro Edition è il notebook compatto per chi crea ASUS ProArt GoPro Edition è il notebook c...
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090 Fable e Sol a confronto: due cartoni animati cre...
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile Il tablet rugged leggero e sottile: Lenovo Think...
TSMC accelera sui 1,4 nanometri: produzi...
Razer compra StreamElements: cambia tutt...
Il Task Manager di Windows arriva su Mac...
Sony: PS5 resta più conveniente d...
Ubisoft spegne uno dei suoi esperimenti ...
Garante Privacy: multa da 9,5 milioni di...
Windows 11, Microsoft promette un sistem...
Windows 11, l'ultima build sperimentale ...
YouTube cancella i canali ASMR più...
Valgono miliardi, ma non pubblicano rice...
ROG Falchion Ace 75 HE: ASUS fa sul seri...
Google rilascia il primo teaser dei Pixe...
Attenti a queste TV Box: a TV spento si ...
Radeon RX 9050: arriva il primo confront...
L'AI Act più severo slitta al 202...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:38.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v