先讲结论再分析。
结论
strcpy会造成栈溢出,strdup不会栈溢出,但可能出现内存泄漏。
分析
针对两函数在漏洞挖掘方面的安全问题进行分析。
函数介绍
- strdup()函数是c语言中常用的一种字符串拷贝库函数,一般和 free() 函数成对出现。
- strcpy()函数把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char*。
溢出原理
- strcpy直接将A字符串复制到另一个地址空间,此时并未对A字符串进行长度校验,A字符串长度可能大于地址空间长度,因此造成溢出。
例
int test()
{
char a[10];
char s[20]='aaaaaaaaaaaaaaaaaaaa';
strcpy(a,b);
return 0;
}
- strdup()在内部调用了malloc()为变量分配内存,不需要使用返回的字符串时,需要用free()释放相应的内存空间,否则会造成内存泄漏。
函数实现
char *strdup(const char *s)
{
char *t = NULL;
if (s && (t = (char*)malloc(strlen(s) + 1)))
strcpy(t, s);
return t;
}
可以看到strdup计算传入字符串S的长度L,申请传入字符串长度L加1的空间B,接下来调用strcpy将S存入B中。因此不会发生栈溢出,但由于空间通过malloc函数申请,若使用后不调用free函数释放空间,则造成内存泄漏。
例
int test()
{
char *s="if used,please free";
char *d;
d=strdup(s);
printf("%s",d);
free(d);//不释放则造成内存泄漏
getchar();
return 0;
}