FUZZ初学笔记(二)

来源:互联网 发布:美国政治正确 知乎 编辑:程序博客网 时间:2024/05/17 05:52

FUZZ初学笔记(二)

  1. 测试数据生成和模糊启发式
    如何生成测试数据的实现方法只是待解决问题的一部分,同等重要的是决定生成什么样的测试数据。比如,我们正在创建一个模拟器以分析一个FTP服务的健壮性,在进行FTP的请求中,我们要加以研究的是数据传输格式和FTP服务器接收后对数据的处理方式

  2. 模糊启发式
    在模糊字符串或者模糊数据列表中所包含的特定的潜在危险值,称为模糊启发式(fuzzheuristics)
    2.1 整形值:在新的改进整形测试试用列表中,选择两个极限边界(0和0xFFFFFFFF)测试用例是很明显的,可能所提供的数字被作为内存分配程序的大小参数。通常额外空间被指定大小所容纳一个头,尾或者终止空字节,例如:

int size = read_ccr_size(packet);//save space for NULL terminationbuffer = (char *)malloc(size + 1);

从上面的来看的话,大小是从packet里面获取,当然一般大小是不会这样由用户进行分配,这里只是提供一个测试用例,那么这里分分配的大小将会在0~FFFFFFFF,被指定的大小可能会被之前的值减去进行分配,当目标程序知道它不准备将所有的指定数据拷贝到新分配的缓冲区时,就会发生这种情况。整形因为为四个字节,所以当运算结果超出32位整数的最大范围就会发生溢出,还有当减法结果小于0就会产生下溢,所以在我们的测试用例中,那么我们将根据具体情况来包含一些边界附近的测试用例,例如0xFFFFFFFF-1,0xFFFFFFFF-2…..和1,2,3,4等,但是如果是以下程序的话

int size = read_ccr_size(packet);//create space for the unicode converted buff//plus unicode NULL termination (2 bytes)buffer = (char *)malloc((size * 2) +2);

那么将要除以二去进行猜测他的一个边界值

3.字符串重复
上面说了如何在模糊测试数据集中包含一些巧妙的整数,但是对于字符串而言,情况又不一样。我们先从“长字符串”开始讨论

perl -e 'print "A"*5000'

当我们对字符串进行模糊测试的时候,希望包含一些含二外的字符串序列,应当首先包含其他的ASCII字符比如B。这是非常重要的,例如由于不同的行为,堆结构中的A的ASCII的值被B的ASCII值覆盖,浙江在微软的windows操作系统中触发堆溢出
3.1 字符分隔符:同样需要包含非字母字符,包括空格和制表符。这些字符通常被用作字符分隔符和终止符。考虑如下代码:

void parse(char *inbuf){    char cpy[16];    char *cursor;    char *delim_index;    int length = 0;    for (cursor = inbuf;*cursor;cursor++){        if(*cursor==':')            delim_index = cursor;        else            length++;    }    //-2 for null termination and the ':' delimiter    if(length < sizeof(cpy)-2)        strcpy(cpy,inbuf);}

如上代码其实包含了一个分隔符的漏洞,如果按照一定规格比如AAA:AAAAAAAAAAA,因为字符串会以NULL为一个结尾,所以15字符会是能输入的上限,但是当我们输入的是AAA:::::AAAAAAAAAAA,这样输入的话,也可以通过长度判断,因为这样的逻辑下来,与输入AAA:AAAAAAAAAAA这个的结果是一样的,但是在执行strcpy的时候,就会因为实际长度超过15而导致一个栈溢出
3.2 字符翻译:需要关注的另外一个问题是字符转换和翻译,特别是关于字符扩展,十六进制0xFE和0xFF在UTF16下被扩展成4个字符,在解析代码中对这样的字符扩展缺乏有效的处理,是存在漏洞的一个重要方面
3.3 目录遍历:目录遍历漏洞会影响网络daemon程序以及Web应用程序
3.4 命令注入:类似于目录遍历漏洞,命令注入漏洞通常与Web应用程序有关,特别是CGI脚本,这类错误不仅与Web应用程序有关,海域公开的私有协议来影响网络daemon程序

0 0