int func(char* str)
{
char buffer[100];
unsigned short len = strlen(str);
if(len >= 100)
{
return (-1);
}
strncpy(buffer,str,strlen(str));
return 0;
}
这段代码容易受到缓冲区溢出攻击,我正在尝试找出原因。我想这与len
被宣布为short
而不是int
,但我不太确定。
有任何想法吗?
在大多数编译器上,a 的最大值unsigned short
是 65535。
任何高于该值的值都会被环绕,因此 65536 变为 0,65600 变为 65。
这意味着长度正确的长字符串(例如 65600)将通过检查,并溢出缓冲区。
Use size_t
存储结果strlen()
, not unsigned short
,并比较len
直接编码大小的表达式buffer
。例如:
char buffer[100];
size_t len = strlen(str);
if (len >= sizeof(buffer) / sizeof(buffer[0])) return -1;
memcpy(buffer, str, len + 1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)