Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Abbiamo provato per dieci giorni la Hyundai IONIQ 5 N, con 650 CV, 770 Nm e uno 0-100 km/h in 3,4 secondi. Il suo punto forte è N e-Shift, che simula un cambio a otto rapporti con suoni da motore termico e perfino un bang supersonico
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-05-2015, 16: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 16:09.
dany1900 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2015, 17:07   #2
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13054
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, 17: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, 11: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, 12:07   #5
das
Senior Member
 
Iscritto dal: Jan 2001
Città: Livorno
Messaggi: 1392
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, 13: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 13:51.
gianmpu è offline   Rispondi citando il messaggio o parte di esso
Old 24-05-2015, 14: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, 15: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, 17: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, 21: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, 23: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 25-05-2015, 00: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, 12:02   #13
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13054
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 12:04.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 25-05-2015, 17: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, 19: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, 02: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, 12: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, 14: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, 16: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


DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP Recensione OPPO Find X10 Pro Max: un top di gam...
Due magneti grandi come un seme di sesam...
Il boss di Instagram avverte: la rabbia ...
Nikon 120-300mm f/2.8: moltiplicatore in...
Targhe personalizzate per auto e moto: c...
Redmi K100 ufficiale, con batteria da 10...
GTA 6, nuovo gameplay in South Park: Jas...
I guru dell'IA sono totalmente slegati d...
Diesel: scatta il taglio delle accise, m...
La pubblicità nell'AI Mode delle ricerch...
Mac Studio M5 Ultra al massimo: 512GB di...
Cyberpunk: il sequel potrebbe introdurre...
WhatsApp prepara una nuova sezione Pagam...
Google lancia Connected Apps Platform pe...
FWA, quanto costa e quali sono le presta...
Sony annuncia la PS5 Prism Collection: n...
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: 15:27.


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