假设您是安全代码审核人,并且您已经遇到了一些问题 像这样的代码:
if(strlen(data) < 100) {
strcpy(buffer, data);
}
为了破坏缓冲区你会怎么做? 那可能吗?如果是这样,怎么样?为什么不使用该条件进行代码安全?
答案 0 :(得分:5)
一个明显的答案是buffer
长度不是 101 chars
,具体情况是程序员忘记复制了null终结符同样(如果buffer
完全 100 chars
长)。我可以从头顶看到两个更微妙的攻击向量:
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;
}
可能的结果是覆盖了大量内存,然后是分段错误。