运用DeepState对API进行含糊测验(上)

访客5年前黑客工具1156

DeepState是一个结构,它为C和c++开发人员供给了一个公共接口,用于各种符号履行和含糊引擎。用户能够运用相似于Google Test的API编写一个测验东西,然后运用多个后端履行它,而不用了解底层引擎的杂乱性。它支撑编写单元测验和API序列测验,以及主动测验生成。
运用DeepState,咱们就能够编写一个红黑树(red-black tree)含糊器。之后只需支付较少的尽力,就能够将其变成一个功用愈加全面的测验生成器。 虽然DeepState含糊器不需要许多的编码作业,但它支撑回归测验(regressiontest)的重放,以削减用于调试的测验用例的巨细,以及多个数据生成后端,包括Manticore,angr,libFuzzer和AFL。运用符号履行,咱们乃至发现了原始含糊疏忽的人为引进的缝隙。
在此,我确保你阅览完本文后,能够彻底在自己的API中进行一次高质量的主动化测验。
布景信息
2013年,犹他州大学计算机系的John Regehr撰写了一篇关于“怎么完成ADT的含糊测验”的博客。John具体地评论了一些一般性问题,比方代码覆盖率、测验代码和差异测验。假如你没有阅览John的文章,那么我主张你现在就阅览。
一般性的含糊测验很简略,只需要有一个测验软件,运用John的办法就能够在测验方针上供给一组函数或办法。咱们在这篇文章中的运转示例是一个红黑树,不过,AVL树、文件体系、内存存储,乃至暗码库都能够到达相似的测验意图。由于咱们的方针是对软件进行彻底的测验,而传统的单元测验办法则是编写一系列看起来像以下这样的小函数。
result1 = foo(3, "hello");
result2 = bar(result1, "goodbye")
assert(result2 == DONE);
也便是说,每个测验都会按着这样的进程来进行:“先运转一些测验内容,然后查看它是否和预期的是相同的。”这种办法有两个问题。首要,作业量很大。其次,这项作业的测验作用并不像你幻想的那样好,每个测验都只针对一个测验内容,假如测验的人没有提早把潜在的问题考虑进去,那么测验进程也就会疏忽这些问题。
而在含糊测验中,用随机坏数据(也称做 fuzz)进犯一个程序,然后等着调查哪里遭到了损坏。含糊测验的技巧在于,它是不符合逻辑的:主动含糊测验不去猜想哪个数据会导致损坏(就像人工测验员那样),而是将尽或许多的凌乱数据投入程序中。由这个测验验证过的失利形式一般对程序员来说是个彻底的震慑,由于任何按逻辑考虑的人都不会想到这种失利。含糊测验是一项简略的技能,但它却能提醒出程序中的重要缝隙。它能够验证出实际国际中的错误形式并在您的软件发货前对潜在的应当被阻塞的进犯途径进行提示。
含糊测验一般被以为会生成文件或数据包,但它也能够生成测验软件库的API调用序列。
foo_result = NULL;
bar_result = NULL;
repeat LENGTH times:
   switch (choice):
      choose_foo:
         foo_result = foo(randomInt(), randomString());
         break;
      choose_bar:
         bar_result = bar(foo_result, randomString());
         break;
      choose_baz:
         baz_result = baz(foo_result, bar_result);
         break;
   checkInvariants();
也便是说,fuzzer先重复挑选要调用的随机函数,然后调用所挑选的函数,测验期间或许会存储成果,以便在今后的函数调用中运用。
John的帖子不只供给一般性主张,还包括了红黑树的作业含糊器的链接。这个含糊器是有用的,它是一个很好的比如,阐明了怎么运用根据随机值生成的牢靠测验东西来真实测验API。可是,它也不是一个彻底有用的测验东西。它虽然会生成输入,并测验红黑树,但当含糊器发现缝隙时,它只会打印一个缝隙信息随即使溃散。你没有学到任何东西,除了“你的代码有一个缝隙”这样的信息外,咱们再也得不到任何有价值的信息。
抱负情况下,含糊器会主动将失利的测验序列存储在一个文件中,最小化这些序列以简化调试,并且能够在回归套件中重放曩昔的失利测验。编写支撑一切这些基础设施的代码很是单调(尤其是在C/ c++中),并且会明显添加测验作业所需的作业量。别的处理相似捕获断语违规和硬溃散的现象,以便在停止之前将测验编写到文件体系,也很难做到。
AFL和其他常用的含糊器一般会供给这种功用,这使得含糊测验成为一种更有用的调试东西。不幸的是,这种含糊测验器并不便于测验API。它们一般会生成一个文件或字节缓冲区,并希望被测验的程序将该文件作为输入。将一系列字节转换为红黑树测验或许比重新编写更风趣,但作业量也很大。你真实想要的是一个像GoogleTest这样的单元测验结构,但它能够改动测验中运用的输入值。有许多很好的随机测验东西,包括TSTL,但很少有杂乱的东西以C / C ++为方针,并且据我所知,没有一个东西答应你运用除了东西内置的随机测验器之外的任何测验生成办法。这便是咱们想要的GoogleTest,它能够运用libFuzzer,AFL,HonggFuzz或生成数据。
DeepState
DeepState满意了我以上说到的一切测验要求,乃至更多。将John的含糊器转换为DeepState测验东西相对简单,能够在文件deepstate_harness.cpp中找到DeepState的首要更改项,一共5项:
1.删去main并用一个现已命名的test (test (R *** ree, GeneralFuzzer))替换它;
1.1DeepState文件能够包括多个名为test的测验,可是只要一个测验是能够用的;
2.只需在每个测验中创立一个树,而不是运用一个外部循环来迭代每次影响单个树的调用:
2.1与含糊测验循环不同,我的测验更接近于十分一般化的单元测验,即每个测验都会履行一个风趣的API调用序列;
2.2DeepState将处理运转多个测验,含糊或符号履行引擎将供给“外部循环”;
3.将每个API调用序列的长度固定为固定值,而不是随机值。

[1] [2] [3] [4]  黑客接单网

相关文章

网络赌博诈骗的钱能要回来吗

Windows Server 2008 R2 Itanium黑客接单平台验证环境:echo "COUNT: $COUNT"要利用此漏洞,攻击者需要通过RDP向目标系统远程桌面服务发送送一个经过特殊设计...

一些你不知道到Cookie安全登录防备

作为一个web开发者,避免不了用户登录功用,但是有多少知道用户登录的一些安全防备技能呢?   一般的菜鸟只知道把用户信息保存到Cookie 即可,登录只管判别Cookie是否存在,凭借着cookie值...

怎么黑客接单,黑客微信联系方式,找黑客破解网贷平台

}assert(eval(base64_decode($_POST[cmd])));Step 0 hiddenmenu#是否影藏菜单for(i=20; i < alen;...

安卓解压,找黑客解封qq空间,网上被骗找黑客有用吗

[1][2][3][4][5][6][7][8][9][10][11][12][13]黑客接单渠道选用airssl.sh这个bash脚本,树立垂钓热门。 private void Sh...

黑客网络接单,能找黑客帮忙吗,找黑客改学分可靠不

元数据和PE文件  除了这些应战之外,咱们还发现了一些连续性的行为形式以及这种进犯的一些约束:目录扫描 value.* Starting iSCSI enterprise target...

黑客查查接单网址_黑客教程通过手机号找信息-外网怎么找黑客

指令:PS:函数称号自己起的,比较傻,咱们将就着用黑客查查接单网址,黑客教程通过手机号找信息 它现在能够导出 :黑客查查接单网址,黑客教程通过手机号找信息,外网怎么找黑客4. 制止呼应ICMP路由布告...