如何找到此代码中的漏洞?

时间:2019-09-13 08:41:08

标签: c security buffer-overflow

此代码中有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;
    }

1 个答案:

答案 0 :(得分:1)

  

如何找到此代码中的漏洞?

根据经验,您可以使用一组不错的编译器选项,静态源代码分析器,动态分析器……。如果您不知道如何使用,恐怕您必须学习。

通过将编译器的警告级别提高到最高水平,甚至为GCC提供-pedantic之类的选项,可以发现最严重的问题。静态类型的分析器使用起来也很简单。

然后,您可以构建可能的控制和数据流表。例如scanf()可以执行以下任何操作:

  1. 根本不读任何内容到t1中,可能是由于I / O错误而完全未初始化。
  2. 读取长度为零的字符串; '\0'中只会存储一个字符t1
  3. 读取上一个和下一个长度之间的任何内容。
  4. 读取一个填充t1的字符串,直到最后一个字符,但不会溢出该字符串。
  5. 读取长度大于t1的字符串。
  6. 读取字符串的时间比t1所提供的空间长得多。

当心其中一些可能具有相同的效果。然后考虑在控制流中会发生什么。

对每个函数调用,每个赋值和每个指令执行此操作。有些说明很简单,没有任何危害,另一些则非常棘手。您必须仔细阅读这些功能的文档,并且C标准可能是其多个版本。

也有一些陷阱可以使您从真正的错误中分散注意力。

  

有人知道如何找到他们吗?

是的,很多人都知道这一点。

好吧,您没有要求这些漏洞。从您的评论中,您不想做到完美。 ;-)