2012-04-05 7 views
0

Ich programmiere ein Programm, um den CRC16 zu knacken. Ich hatte einige Probleme mit der Ausgabe der Datei und behalten Sie den berechneten CRC16 (habe keine Ahnung, warum es sich ändert, wenn ich es in eine Datei schreibe). Also, was ich hier mache, lese die Eingabedatei, schreibe sie mit etwas Kauderwelsch in eine Ausgabedatei, und dann lese ich die Ausgabedatei erneut und berechne ihre CRC16. Wenn es mit der gewünschten CRC16 übereinstimmt, ist es getan. Nach einigen Hinrichtungen stürzt die Methode fgets() jedoch mit einem Seg-Fehler ab.fgets() stürzt nach einer Anzahl von Ausführungen ab

Jeder könnte mir helfen? Bitte ignorieren Sie die Leistungsprobleme, das ist ein Test.

int main(int argc, char* argv[]){ 

     char outfile[strlen(argv[1])]; 
     strcpy(outfile,argv[1]); 

     strcat(outfile,".crack"); 

     char crc16[5]; 
     strcpy(crc16,argv[2]); 
     char newcrc16[5]; 
     char gebrish[80]; 
     char cat[2]; 
     int full = 1; 
     int p = 0; 
     int i,j,k; 


     for(i=32; i< 128;i++) 
       for(j=32; j< 128; j++) 
         for(k=32; k < 128; k++){ 
           gebrish[0] =i; 
           gebrish[1] =j; 
           gebrish[2] =k; 
           gebrish[3] = '\n'; 
           gebrish[4] ='\0'; 

           boost::crc_16_type result; 

           FILE* file; 
           FILE* out; 
           char line[100]; 

           printf("read out\n"); 
           out = fopen(outfile,"w"); 

           printf("read file\n"); 
           file = fopen(argv[1],"r"); 
       printf("wrt\n"); 
           while(fgets(line,80,file) != NULL){ 
             fputs(line,out); 
           } 
           fputs(gebrish,out); 

           fclose(file); 
           fclose(out); 

           printf("read gain\n"); 
           out = fopen(outfile,"r"); 

           while(fgets(line,80,out) != NULL){ 
             result.process_bytes(line,strlen(line)); 
             printf("%s",line); 
           } 

           int crc = result.checksum(); 

           sprintf(newcrc16,"%x",crc); 
           printf("%s",newcrc16); 

           if(strcmp(crc16,newcrc16) == 0){ 

             printf("%s",gebrish); 
             return 0; 

           } 
         } 



     return 0; 
} 
+0

Welches fgets stürzt ab? 1. Schleife, 2. Schleife oder beides? – stark

Antwort

1

Dies führt zu einem Pufferüberlauf:

char outfile[strlen(argv[1])]; 
strcpy(outfile,argv[1]); 

strcat(outfile,".crack"); 

wie es in outfile für abschließende Nullzeichen und ".crack" nicht genügend Platz vorhanden ist. Es wird Speicher überschreiben, den es nicht soll und kann die Ursache des Segmentierungsfehlers sein.

Wechseln zu:

char outfile[strlen(argv[1]) + 1 + 6]; 
    strcpy(outfile,argv[1]); 

    strcat(outfile,".crack"); 

Vor dem Zugriff argv Elemente sorgen sie durch die Überprüfung argc zur Verfügung gestellt:

auch
if (argc > 2) 
{ 
    /* Safe to use argv[1] and argv[2]. */ 
} 

prüfen Rückgabewerte von fopen().

+0

Danke für den Hinweis auf die Puffergröße. Wie auch immer, der Fehler ist nicht da, ich habe den Code repariert (ich vermute, der Compiler hat ihn vorher repariert), aber es gibt denselben Fehler und stürzt in der gleichen Zeit ab. –

0

Der Fehler liegt wahrscheinlich daran, den Rückgabewert nicht von open zu überprüfen und dann fgets in einer fehlerhaften Datei aufzurufen. Rückgaben von Systemaufrufen sollten immer überprüft werden, wenn nachfolgende Operationen von ihnen abhängen. Selbst das Schließen kann fehlschlagen.

+0

Ich sehe, was Sie meinen, aber ich teste es in einer wirklich kontrollierten Umgebung. Die Dateien werden immer da sein. Wie auch immer, es stürzt nach einem Haufen Ausführung der Schleife ab, nicht im ersten Moment. Außerdem muss ich wissen, warum es abstürzt und nicht wie ich den Absturz vermeiden kann. Vielen Dank! –

0

Das Problem ist, dass ich versucht habe, aus der gleichen Datei in verschiedenen Momenten zu lesen und zu schreiben, ohne fclose() nach der Verwendung aufzurufen. Auf diese Weise stürzt es nach einer gewissen Ausführung der Schleife mit einer STATUS_VIOLATION ab. Ich habe keine Ahnung, warum es nicht sofort abgestürzt ist, aber alles, was ich getan habe, war ein flocose() nach dem Lesen der Datei für die CRC16-Berechnung.