Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
be quiet! debutta nel settore mouse da gaming con Dark Perk Ergo e Dark Perk Sym: due modelli gemelli per specifiche, con polling rate di 8.000 Hz anche in wireless, sensore PixArt PAW3950 da 32.000 DPI e autonomia dichiarata fino a 110 ore. Nel test, a 8.000 Hz si arriva a circa 30 ore reali, con ricarica completa in un'ora e mezza
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: 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.
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: 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; //<<---
}
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: 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';
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


Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Substack conferma violazione: esposti da...
L'IA costa caro. Oracle punta a raccogli...
OpenAI lancia Frontier: il cervello cent...
Questo robot aspirapolvere lava sempre c...
Il PC non si avvia? ASRock invita a cont...
8 smartphone Android in forte sconto su ...
Samsung House apre a Milano: la casa tec...
Broadcom esclude i cloud provider pi&ugr...
Allerta sicurezza per n8n: come protegge...
NIO raggiunge il primo storico profitto ...
Memorie DDR5 cinesi nel tuo prossimo PC?...
Volkswagen e Stellantis chiedono all'UE ...
Final Fantasy VII Remake Parte 3 potrebb...
Lo spettacolo pirotecnico della Xiaomi S...
Black Myth: Wukong potrebbe approdare su...
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:36.


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