假设你是安全代码审计人员并且你已经陷入了一些
像这样的代码:
if(strlen(data) < 100) {
strcpy(buffer, data);
}
你会怎么做才能破坏缓冲区?
那可能吗?如果是这样,如何?为什么不使用该条件来保证代码安全?
最佳答案
一个明显的答案是,如果 buffer
不是至少 101 chars
long,一种特殊情况是程序员忘记了空终止符也被复制(如果 buffer
正好是 100 chars
long)。我可以从头顶上看到两个更微妙的攻击 vector :
data
可能与非可读内存接壤,并且不包含空终止符。这将导致段错误或访问冲突,但不会直接导致内存损坏。 data
和 buffer
在被视为字符串时可能会重叠。在这种情况下,行为是未定义的。 以第二次攻击为例,代码如下:
#include <stdio.h>
#include <string.h>
int main(void)
{
char someImportantString[] = "Something that should not be overwritten";
char buffer[101] = "\0goodbye cruel world";
char data[16] = {'h', 'e', 'l', 'l', 'o',' ','w','o','r','l','d',
'x','x','x','x','x'};
if(strlen(data) < 100)
{
printf("Probably not good\n");
strcpy(buffer, data);
}
return 0;
}
这样做的可能结果是覆盖大量内存,然后出现段错误。
关于c - 绕过内存损坏限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21066684/