smt*_*tsp 7 c c++ security exploit
假设我有一个具有缓冲区溢出漏洞的代码,如下所示
int func(const char *str){
char buffer[100];
unsigned short len = strlen(str);
if(len >= 100){
return -1;
}
strncpy(buffer,str,strlen(str));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(取自这个问题)
如果从另一个函数(而不是用户输入)获取输入并且str的长度始终小于100,是否有办法利用此漏洞?
例如
int main() {
int user_input;
if (cin >> user_input) {
if(user_input == 1)
func("aaaa");
else
func("bbbb");
}
}
Run Code Online (Sandbox Code Playgroud)
假设代码中没有其他漏洞.
只是一个假设的问题,任何想法?
简而言之,不存在漏洞。每个输入都已清理=没有漏洞。
但这并不意味着您应该不修复它。虽然不存在物理漏洞,但存在很大的潜在漏洞。现在您不会传递任何超过 100 个字符的内容。但从现在起几个月后呢?您还记得只能传递少于 100 个字符的输入吗?我不这么认为。
您可以通过以下方式修复它:
strlen
)size_t
malloc
成功strnlen
与 一起使用sizeof(buffer)
而不是strlen
len
作为第二个参数传递(可能很烦人)使用strncpy(a, b, strlen(b))
与使用相同strcpy(a,b)
。通过指令中的检查在一定程度上可以防止这种情况if
,但是其存储的选择unsigned short
无论如何都使其毫无价值。最好使用它strncpy(a, b, len)
来表明确实len
需要在那里,以防检查被重构。