我正在编写程序来破解CRC16。我在输出文件时遇到了一些问题,并保留了计算出的CRC16(当我把它写入文件时,不知道它为什么会改变)。所以我在这里做的是读取输入文件,将其写入带有一些乱码的输出文件,然后我再次读取输出文件并计算它的CRC16。如果它与所需的CRC16匹配,则完成。然而,在一堆执行之后,fgets()方法因Seg故障而崩溃。
有人可以帮助我吗?请忽略性能问题,这是一个测试。
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 :(得分:1)
这会导致缓冲区溢出:
char outfile[strlen(argv[1])];
strcpy(outfile,argv[1]);
strcat(outfile,".crack");
因为outfile
中没有足够的空间来终止空字符和".crack"
。它将覆盖不应该的内存,可能是分段错误的原因。
更改为:
char outfile[strlen(argv[1]) + 1 + 6];
strcpy(outfile,argv[1]);
strcat(outfile,".crack");
在访问argv
元素之前,请先检查argc
:
if (argc > 2)
{
/* Safe to use argv[1] and argv[2]. */
}
同时检查fopen()
的返回值。
答案 1 :(得分:0)
错误很可能是由于未检查open的返回值,然后在坏文件上调用fgets。如果后续操作依赖于系统调用,则应始终检查系统调用的返回值。即便关闭也会失败。
答案 2 :(得分:0)
问题是我尝试在不同的时刻从同一个文件读取和写入,而不是在使用后调用fclose()。这种方式在循环执行后,它会以STATUS_VIOLATION崩溃。我不知道它为什么不立即崩溃,但我所做的只是在读取CRC16计算文件后添加一个flcose()。