当在某特定数据结构的内存空间的边界之外写入数据时,即会发生缓冲区溢出。
本篇主要针对字符串操作错误引发的漏洞。
1、无界字符串复制
发生于从源数据复制数据到一个定长的字符数组时
1.1 使用gets()从标准输入读取数据到一个定长的缓冲区中
// gets()函数读取输入时不会判断上限,很容易造成缓冲区溢出
char buf[8]; gets(buf);
修复方案:使用getchar()获取输入,并确保赋值给缓冲区的字符数不超过缓冲区的大小
char buf[SIZE];
int index = 0;
while((ch = getchar()) != '\n'){
if (index < SIZE -1 )
buf[index++] = ch;
}
buf[index] = '\0'; //超过分配的缓冲区大小时截断
1.2 复制和连接字符串。
//strcpy()、strcat()执行无界复制操作,同样不会检测上限
char s[128];
strcpy(s, argv[0]);
修复方案1:给数组动态分配适当的大小 char *s = (char *)malloc(strlen(argv[0]) + 1); //分配空间,加一是为了容纳空字符\0 if (s != NULL) strcpy(s, argv[0]); free(s);
修复方案2:使用strlcpy()、strlcat()代替strcpy(),这两个函数可指定目标缓冲区的大小,只复制前size个 strlcpy(char *dest, const char *src, size_t size) strlcat(char *dest, const char *src, size_t size)
2、空字符结尾错误
字符串没有正确地以空字符\0结尾。
//strncpy()、strncat()都可指定目标缓冲区的大小,但是它们不会在结尾为字符串添加空字符
char destination[MAX_SIZE]; strncpy(destination, source, sizeof(destination)-1); strcpy(c, destination); //执行到strcpy,destination结尾没有空字符,因此内存里\0前的内容都会复制给c,导致内存泄漏 修复:在结尾添加\0 destination[sizeof(destinatin) - 1] = '\0'
标签:destination,空字符,char,漏洞,strcpy,缓冲区,溢出,size From: https://www.cnblogs.com/jimmy-hwang/p/17227643.html