2012-04-05 7 views
0

私はCRC16をクラックするプログラムをコーディングしています。私はファイルを出力する際に​​いくつかの問題を抱えていました。計算されたCRC16を保持しています(ファイルに書き込むときになぜそれが変化するのか分かりません)。そこで私がここでやっていることは、入力ファイルを読み込んで出力ファイルに書き出し、出力ファイルを再度読み込んでCRC16を計算することです。それが所望のCRC16と一致すれば、それは完了する。しかし、実行の束の後、fgets()メソッドはSegフォールトでクラッシュします。多くの実行の後にfgets()がクラッシュする

誰でも手伝ってもらえますか?パフォーマンスの問題を無視してください。これはテストです。ヌル文字と".crack"を終了するためoutfileに十分なスペースがないよう

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

strcat(outfile,".crack"); 

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

どのfgetsがクラッシュするのですか?第1ループ、第2ループ、またはいずれか? – stark

答えて

1

これは、バッファオーバーランが発生します。それは想定されていないメモリを上書きすることになり、になる可能性があります。

変更:

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

チェック戻り値:argv要素にアクセスする前に

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

    strcat(outfile,".crack"); 

は、彼らがargcをチェックすることにより、提供されていることを確認します。

+0

バッファサイズに関するメモをありがとう。しかし、エラーはありませんが、私はコードを修正しました(私はコンパイラがそれを修正していたと思います)。しかし、同じエラーが発生し、同時にクラッシュします。 –

0

このエラーは、openからの戻り値をチェックしてから、不正なファイルに対してfgetsを呼び出さないことが原因です。後続の操作がシステムコールに依存する場合は、システムコールからの戻り値を常にチェックする必要があります。近くにさえ失敗することがあります。

+0

私はあなたが何を意味するかを見ていますが、実際に制御された環境でテストしています。ファイルは常にそこにあります。とにかく、最初の瞬間ではなく、ループの実行後にクラッシュします。また、クラッシュを避ける方法ではなく、クラッシュする理由を知る必要があります。ありがとう! –

0

問題は、使用後にfclose()を呼び出さずに、同じファイルから別の瞬間に読み書きしようとしたことです。ループのいくつかの実行後、この方法で、STATUS_VIOLATIONでクラッシュします。なぜ私はすぐにクラッシュしなかったのか分かりませんが、私がしたのはCRC16計算のためにファイルを読み込んだ後にflcose()を追加したことだけでした。

関連する問題