此代码中有4个易受攻击的点。有谁知道如何找到他们?
char *alloc_and_copy(char *dst,char src[], unsigned int nbcells) {
unsigned char size;
size = nbcells;
dst = (int*)malloc(size);
strcpy(dst, src);
return dst;
}
int main() {
char t1[256];
char *t2;
scanf("%s", t1);
t2 = *alloc_and_copy(t2, t1, 256);
sprintf("%s", t2);
free(t2);
return 0;
}
答案 0 :(得分:1)
如何找到此代码中的漏洞?
根据经验,您可以使用一组不错的编译器选项,静态源代码分析器,动态分析器……。如果您不知道如何使用,恐怕您必须学习。
通过将编译器的警告级别提高到最高水平,甚至为GCC提供-pedantic
之类的选项,可以发现最严重的问题。静态类型的分析器使用起来也很简单。
然后,您可以构建可能的控制和数据流表。例如scanf()
可以执行以下任何操作:
t1
中,可能是由于I / O错误而完全未初始化。'\0'
中只会存储一个字符t1
。t1
的字符串,直到最后一个字符,但不会溢出该字符串。t1
的字符串。t1
所提供的空间长得多。当心其中一些可能具有相同的效果。然后考虑在控制流中会发生什么。
对每个函数调用,每个赋值和每个指令执行此操作。有些说明很简单,没有任何危害,另一些则非常棘手。您必须仔细阅读这些功能的文档,并且C标准可能是其多个版本。
也有一些陷阱可以使您从真正的错误中分散注意力。
有人知道如何找到他们吗?
是的,很多人都知道这一点。
好吧,您没有要求这些漏洞。从您的评论中,您不想做到完美。 ;-)