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

访客5年前黑客工具1155

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

相关文章

破解word密码,网站黑客联系,怎么找黑客破解QQ空间的秘密

最后用 RMI 绑定实例目标办法,并运用 JNDI 去获取并调用目标办法(CallService.java):$html.= ''; emDirect("./plugin.php?error_d=1...

犯罪分子竟使用签名Rootkit窃取登录和付款信息-黑客接单平台

近期,研究人员发现有网络犯罪分子正在大规模的歹意活动中运用数字签名的Rootkit来盗取方针用户的登录凭据、付出信息以及浏览器历史记录,并以此来对交际网络用户进行网络欺诈以及歹意广告传达活动。 研究人...

找黑客做男朋友是不是太危险了

Spring是一个Java/Java系统版本https://github.com/go-gitea/gitea/releases/tag/v1.8.0-rc3成功利用此漏洞的攻击者可以在目标系统上执行...

唯一信誉的黑客接单网站_如何找黑客破解qq密码软件

在本年,咱们还看到了几个“老朋友”,从熟睡中醒来,从头呈现在咱们的视界之中。 在这一章,咱们首要评论一些闻名的歹意安排,因为不明原因(或许是缺少相应的监测)近年来没有发现有太大的动作,但近期又从头呈现...

已删除的短信在哪里找,怎样可以联系到黑客,去哪里找黑客技术

翻开浏览器,输入URL:http://www.test.ichunqiu0ea5d0d826854cdbf955da3311ed6934经过搜索引擎,可看到该安排早在2014年就开端对很多网站进行进犯...