假设我想开始对 Acme Corp 的 PDF 阅读器进行模糊测试。我想尝试通过下载一堆良性 PDF 并对其进行变异来遵循米勒的做法。
米勒首先通过修剪具有相似代码覆盖率的样本来将他的 PDF 样本语料库减少到最低限度。
那具体的步骤是怎么做的?也就是说,他是如何确定什么是类似的代码覆盖率的?
我可以想象一个跟踪执行并记录 JMP/CALL 以获取执行图的工具,我想您可以区分这些图。但是 JIT 代码呢?由于 JIT 可能位于内存中的不同位置,这些图会不会有很大不同?
假设我想开始对 Acme Corp 的 PDF 阅读器进行模糊测试。我想尝试通过下载一堆良性 PDF 并对其进行变异来遵循米勒的做法。
米勒首先通过修剪具有相似代码覆盖率的样本来将他的 PDF 样本语料库减少到最低限度。
那具体的步骤是怎么做的?也就是说,他是如何确定什么是类似的代码覆盖率的?
我可以想象一个跟踪执行并记录 JMP/CALL 以获取执行图的工具,我想您可以区分这些图。但是 JIT 代码呢?由于 JIT 可能位于内存中的不同位置,这些图会不会有很大不同?
不确定它对使用 JIT 编译代码的应用程序的影响如何,但是 peach 有一个minset实用程序来制作具有最高代码覆盖率的最小文件集:
该工具将通过目标程序运行每个示例文件并确定代码覆盖率。然后它将找到覆盖最多代码所需的最少文件数。这将是模糊测试时应使用的最小文件集。
但据我所知,它使用了您提出的方法,监控应用程序所有基本块的命中。它使用 pintool 来做到这一点。
尽管它与 GCC 紧密结合,但该gcov
项目作为 Linux 代码覆盖工具很受欢迎。但是,它需要使用-fprofile-arcs -ftest-coverage
标志来编译您的程序,如果针对闭源软件,这可能不是一个选项。更多信息可以在这里找到:http : //gcc.gnu.org/onlinedocs/gcc/Gcov.html