假设你是安全代码审计人,你已经进入了一些像这样的代码:
if(strlen(data)< 100){ strcpy(缓冲区,数据);}你会怎么做才能破坏缓冲区?…
一个明显的答案是,如果 buffer 至少不是 的 101 强> chars 很长一段时间,当程序员忘记复制空终止符时(如果是 buffer 确切地说 的 100 强> chars 长)。我可以从头顶看到两个更微妙的攻击向量:
buffer
chars
data 可以在不可读的存储器上边界并且不包含空终止符。这会导致分段错误或访问冲突,但不会直接导致内存损坏。
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; }
可能的结果是覆盖了大量内存,然后是seg-faulting。