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

访客5年前黑客工具1158

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]  黑客接单网

相关文章

黑客技术论坛,找黑客改学信网可靠吗,网上被骗了钱怎么找黑客追回

12import flash.net.URLLoader; public class XDomainXploit extends Sprite { public function XDomainXpl...

数据出售,找黑客改住单,我找黑客盗号被骗了

print ?n?;1、上传代码页面 我上传的是ashx页面。 翻开Burp Suite,Proxy->Options,设置署理服务器: 'DB_HOST' => '"....

黑客接单一般要多少钱,广州现实黑客那里找,找黑客找qq密码吗

试验环境本文即将介绍以下内容:(1105, "XPATH syntax error: 'd-y0u-fee1-l1ke-th3-sql1-eng1ne}'")④敏捷扫描(NoPing) -D,...

出名的黑客接单吗_黑客找盗号

};作为信息安全抢先媒体的小编,这次首要重视的是仍是关于“缺德的智能打扰电话”。 出名的黑客接单吗,黑客找盗号 2、域环境与一切经过扩展支撑第三方可扩展性的阅读器相同,应用时的安全体会或许最具有挑战性...

Python高档爬虫(四):动态加载页面的解决方案与爬虫署理

假如读者读过我前面的关于爬虫的文章,应该大约都清楚咱们现在能够对一个静态的web页面”随心所欲“了,可是技能的开展总是没有止境的,仅仅是这样对静态页面处理远远不够,要知道现在许多的web页面有意无意为...

请问,被网络赌博被骗了二万能追回来么

· https://www.shodan.io/search?query=port%3A3389+2003wls9_async_response.warExchange修复办法请问,被网络赌博被骗了二...