gpt4 book ai didi

c++ - 如果输入是安全的,是否有可能利用易受攻击的函数?

转载 作者:可可西里 更新时间:2023-11-01 18:39:02 25 4
gpt4 key购买 nike

假设我有一个存在缓冲区溢出漏洞的代码如下

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;
}

(取自此question)

如果从另一个函数获取输入(不是用户输入)并且 str 的长度总是小于 100,是否有办法利用此漏洞?

例如

int main() {
int user_input;
if (cin >> user_input) {
if(user_input == 1)
func("aaaa");
else
func("bbbb");
}
}

假设代码中没有其他漏洞。

只是一个假设性的问题,有什么想法吗?

最佳答案

简而言之,没有漏洞。每个输入都经过清理 = 没有漏洞。

但这并不意味着您应该让它不固定。虽然没有物理漏洞,但有很多可能出现漏洞。 现在您不会传递超过 100 个字符的任何内容。但是从现在开始几个月呢?你还记得你只能传递少于 100 个字符的输入吗?我不这么认为。

您可以通过以下方式修复它:

  1. 选择将 strlen 保存在 size_t 中(但如果变量长于 4GB,这不会避免缓冲区溢出)
  2. 使用动态分配的缓冲区并检查您是否成功malloc
  3. 使用 strnlensizeof(buffer) 而不是 strlen
  4. len 作为第二个参数传递(可能很烦人)

使用 strncpy(a, b, strlen(b)) 与使用 strcpy(a,b) 相同。这在一定程度上通过 if 指令中的检查被阻止了,但是选择 unsigned short 来存储使得它无论如何都毫无值(value)。最好使用 strncpy(a, b, len) 来表明 len 确实需要存在,以防检查被重构。

关于c++ - 如果输入是安全的,是否有可能利用易受攻击的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29961863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com