在我们公司的编码标准中禁止使用普通的旧 strcpy,因为它可能会导致缓冲区溢出。我正在寻找我们在代码中链接的一些第 3 方库的源代码。库源代码像这样使用 strcpy:
for (int i = 0; i < newArgc; i++)
{
newArgv[i] = new char[strlen(argv[i]) + 1];
strcpy(newArgv[i], argv[i]);
}
因为在为要复制到的缓冲区分配内存时使用了 strlen,所以这看起来不错。有没有可能有人可以利用这个正常的 strcpy,或者这是否像我认为的那样安全?
我见过 strcpy 的天真使用导致缓冲区溢出的情况,但这似乎没有,因为它总是使用 strlen 为缓冲区分配正确的空间量,然后使用 argv[ ] 作为应始终以 null 终止的来源。
老实说,我很好奇是否有人使用调试器运行这段代码可以利用这个,或者是否有人试图破解我们的二进制文件(使用我们在其编译版本中链接的库源)可以使用任何其他策略来利用 strcpy 的这种用法。感谢您的投入和专业知识。
最佳答案
安全地使用 strcpy
是可能 - 这只是相当艰苦的工作(这就是为什么您的编码标准禁止它)。
但是,您发布的代码不是漏洞。无法用它覆盖内存位;我不会费心重写它。 (如果您确实决定重写它,请改用std::string
。
关于c++ - 安全使用 strcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50218217/