无符号短覆盖

时间:2012-03-28 13:17:39

标签: gcc unsigned

while(fscanf(fp,"%s",strings [cnt ++])!= EOF);

cnt是一张未签约的短片。它有65535.所以当文件达到的时间超过那些字时,cnt再次初始化为0并继续。我的问题是这会发生在所有编译器上还是只发生在gcc上?

4 个答案:

答案 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种不同的漏洞:

  1. strcpy(filename, argv[1]);,其他人提到过。

  2. strings[cnt++] - 如果文件包含的行数超过USHRT_MAX,则会超过strings数组。你将开始阅读用于其他事情的堆栈区域。

  3. 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;

...所以你要保证你的字符串在限制范围内有一个大小限制。