while(fscanf(fp,"%s",strings [cnt ++])!= EOF);
cnt是一张未签约的短片。它有65535.所以当文件达到的时间超过那些字时,cnt再次初始化为0并继续。我的问题是这会发生在所有编译器上还是只发生在gcc上?
答案 0 :(得分:2)
char filename[128];
strcpy(filename, argv[1]);
filename
只能存储128个字符(127 + NULL字符)。当用户传递超过127个字符的参数(由paxdiablo指出)时,可能会发生溢出。
理想情况下,您的应用程序会计算输入参数中有多少个字符,并分配一个足够大的变量来存储此信息:
int param_size = strlen(argv[1]);
char* filename = malloc(param_size+1);
if (!filename)
{
// TODO: memory allocation failed! Need to handle error.
// (notify the user, quit the application or something).
}
strcpy(filename, argv[1]);
答案 1 :(得分:0)
这里有3种不同的漏洞:
strcpy(filename, argv[1]);
,其他人提到过。
strings[cnt++]
- 如果文件包含的行数超过USHRT_MAX
,则会超过strings
数组。你将开始阅读用于其他事情的堆栈区域。
fscanf(fscanf(fp, "%s",...
- 如果一行包含超过79个字符,您将覆盖以下行。除非你超过整个字符串数组,否则它将是无害的。
答案 2 :(得分:0)
漏洞:
1)没有检查argc是否确实存在argv [1]。如果用户在没有任何命令行参数的情况下键入homework.exe,则索引可能无效。
2)没有检查argv [1]的内容是否适合文件名缓冲区。现在,它假定文件是由文本行构成的,其中没有行超过79个字符。
3)fscanf()假定某种文件格式。这可能是也可能不是漏洞。如果它不包含给定格式的字符串,或者它包含的行数多于未签名的短行中的行数,则程序将崩溃&燃烧。
答案 3 :(得分:0)
您可以避免这样的代码:
char filename[128];
strcpy(filename, argv[1]);
...并编写更像这样的代码:
#define BUFSIZE 128
char filename[BUFSIZE];
strncpy(filename, argv[1], BUFSIZE);
strcpy的strNcpy版本限制了您可以复制的字符。使用宏来表示大小是好的,因此您可以稍后更改这些缓冲区大小,并且不会使用神奇的数字填充代码。
出于同样的原因,你可以避免直接使用fscanf,你可以使用一个函数来传递一个固定大小的字符串,而不是一个无限制的字符串。或者你可以做这样的事情
strings[STRINGSIZE] = 0;
cnt = cnt % STRINGSIZE;
...所以你要保证你的字符串在限制范围内有一个大小限制。