void Challenge(char *str) { Char temp[9]={0}; strncpy(temp , str , 8); printf("temp=%s\n", temp); if(strcmp(temp,"Please!@")==0){ printf("KEY: ******"); } } Int main(int argc , char *argv[ ]) { Char buf2[16] Int check=1; Char buf[8] Strcpy (buf2, "give me key! !"); strcpy(buf , argv[1]); if(check==65) { Challenge(buf); } else { printf("Check is not65 (%d) \n Program terminated!!\n", check); } Return 0; }上述代码所存在的漏洞名字是什么,针对本例代码,请简要说明如何修正上述代码以修补次漏洞。
时间: 2024-02-27 08:51:37 浏览: 83
上述代码存在缓冲区溢出漏洞。具体来说,当用户输入的字符串长度超过8个字符时,会导致buf2数组溢出,覆盖掉check变量的值,从而导致Challenge函数中的if语句判断出现错误。
修正代码的方法是,在Challenge函数中,对传入的参数str进行长度判断,如果长度超过8个字符,则直接返回,不继续执行。修正后的代码如下:
```
void Challenge(char *str) {
char temp[9] = {0};
strncpy(temp, str, 8);
printf("temp=%s\n", temp);
if(strcmp(temp, "Please!@") == 0) {
printf("KEY: ******");
}
}
int main(int argc, char *argv[]) {
char buf2[16];
int check = 1;
char buf[8];
strcpy(buf2, "give me key! !");
strncpy(buf, argv[1], 7); // 修正代码,只拷贝7个字符,最后一个字符用'\0'填充
buf[7] = '\0'; // 添加这一行,保证buf以'\0'结尾
if(check == 65) {
Challenge(buf);
} else {
printf("Check is not65 (%d)\nProgram terminated!!\n", check);
}
return 0;
}
```
阅读全文