
上QQ阅读APP看书,第一时间看更新
2.2.5 与函数无关的字符串错误
大部分在标准字符串处理库<string.h>中定义的函数都非常容易出错,包括strcpy()、strcat()、strncpy()、strncat()和strtok()等。例如,微软Visual Studio已经废弃了许多这样的函数。尽管如此,由于空字符结尾的字符串是用字符数组实现的,因此,完全有可能在不调用任何函数的情况下做了不安全的字符串操作。下面的程序并没有调用任何字符串库函数,然而却包含了一个由字符串复制操作导致的缺陷。
01 int main(int argc, char *argv[]) { 02 int i = 0; 03 char buff[128]; 04 char *arg1 = argv[1]; 05 if (argc == 0) { 06 puts("No arguments"); 07 return EXIT_FAILURE; 08 } 10 while (arg1[i] != '\0') { 11 buff[i] = arg1[i]; 12 i++; 13 } 14 buff[i] = '\0'; 15 printf("buff = %s\n", buff); 16 exit(EXIT_SUCCESS); 17 }
这个有缺陷的程序接受一个字符串参数,并将其复制到buff字符数组,然后打印buff中的内容。变量buff被声明为一个128个字符长的定长数组。如果提供给程序的第一个参数等于或者超过128个字符(请记住还有结尾的空字符),这个程序就会在数组的边界外进行写操作。
显然,消除对危险函数的使用并不能保证你的程序就能够避免安全缺陷。在接下来的几节中,你将会看到这些安全缺陷是如何导致可被利用的漏洞的。