C 如何在此代码中找到漏洞?

C 如何在此代码中找到漏洞?,c,security,buffer-overflow,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() {

此代码中有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;
    }
如何在此代码中找到漏洞

有经验的话,一套好的编译器选项,一个静态源代码分析器,一个动态分析器。。。任何你知道如何使用的东西。如果你不知道如何使用这样的工具,恐怕你必须学会

通过将编译器的警告级别提高到最大,甚至为GCC提供类似
-pedantic
的选项,您可以发现最严重的问题。这同样适用于静态类型使用非常简单的分析仪

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

  • t1
    中完全不读取任何内容,使其完全未初始化,可能是因为I/O错误
  • 读取长度为零的字符串;只有一个字符,
    '\0'
    将存储在
    t1
  • 阅读上一段和下一段之间的任何内容
  • 读取填充到最后一个字符的字符串
    t1
    ,但不要使其溢出
  • 读取长度超过
    t1的字符串
    为其提供空间
  • 读取比
    t1
    提供的空间长得多的字符串
  • 注意,其中一些可能具有相同的效果。然后思考控制流下会发生什么

    对每个函数调用、每个赋值和每个指令都这样做。有些说明很简单,不会造成任何伤害,有些则相当棘手。您必须仔细阅读函数的文档,C标准可能不止一个版本

    也有一些陷阱让你从真正的错误中分心

    有人知道怎么找到他们吗

        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;
        }
    
    是的,很多人都知道这一点


    好吧,你没有问过漏洞。从你的评论来看,你不想这么做,太完美了

    你觉得怎么样?你甚至把这个问题标记为“缓冲区溢出”。只有4个?我觉得这是偏低的。打开编译器警告应该有助于解决一些问题。1)缓冲区溢出2)分段3)输入验证4)无符号int(4字节)到无符号char(1字节)可能您误解了这个问题。我不想让任何人发现代码中的粗俗之处(代码摘自大学考试曲目),但想帮助我了解应该寻找什么,以及我们可以建议在这一行代码中存在漏洞的线索。@Vincenzorrodolaforgia这听起来像“给定任意代码,我如何知道是否存在漏洞?”你认为正确答案会是什么形式?这里的答案是“使用编译器警告,然后使用静态分析器,然后检查代码。”你认为正确的答案会说其他的话吗?如果你更深层次的观点是“C很难正确”,是的,这是正确的。几十年的程序语言研究已经开始用更容易理解的东西取代C语言。然而,我们经常在C工作,这很难。