[MISTERO] C corruzione della memoria

Area di discussione libera.

Moderatore: Staff

Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Messaggio da Mario Vanoni »

conraid ha scritto:
puzuma ha scritto:
@phobos3576

il buffer overflow non è quello che dici tu, è un errore del programmatore che va scrivere in area di memoria in modo non intenzionale, poi un cracker può tentare di sfruttarlo.
Valgono entrambe le cose. Spesso i buffer overflow sono creati ad arte, per scopi più o meno "salutari" :-)
Comunque non vedo il problema, non penso che cambi la sua definizione se sia stata l'imperizia o la furbizia del programmatore a farlo
Da programmi di vent'anni fa`, che funzionano tutt'ora in ditta senza problemi, con sentinelle!

Codice: Seleziona tutto

#define NOSTRS 5000
#define STRLEN 16 /* solo 10 possibili, 16 per soddisfare i little-endian Intel */
/* i big-endian WE32[012]00 di AT&T (3B2) erano soddisfatti con 11 */
...
int main(void)
{
       char bufn[NOSTRS][STRLEN], filename[16]; /* 16?, vedi sopra */
       int i;
...
       /* aperta, controllando, la directory, altrimenti exit con error message */
       i = 0;
       while (sfogliando la directory)
       {
               /* file leggibile/esistente, altrimenti exit con error message */
               if (filename == lungo_esattamente_10_cifre)
               {
                       strcpy(bufn[i], filename);
                       i++;
                }
                else
                       continue; /* ignoramolo, no ci interessa qui` */
...
/* ora chiudiamo la directory, poi assicuriamoci! */
       strcpy(bufn[i], "~~~"); /* la sentinella, l'ultimo carattere ASCII, vedi sort(1) */
       i++; /* il numero delle entrate, compresa la sentinella */
...
/* riordiniamo in sequenza ASCII il tutto */
      qsort(bufn, (size_t) i, STRLEN, programma_in_C_per_comparare);
...
/* se in seguito, alla fine,arriviamo ad un file di nome "~~~", guai in vista */
...
...
...
/* secondo esempio,  con previsti p.e. 100 case di numero */
switch(i)
{
       case 0:
              ...
              break;
...
...
       case 99:
              ...
              break;
       default:
              exit(fprintf(stderr, "Impossibile case numero %d raggiunto, esco.\n", i));
}
Ricordate che in C/UNIX si conta _sempre_ cominciando dallo 0 (zero),
e programmare in modo difensivo e` l'autodifesa del programmatore.

Mario Vanoni

Rispondi