阅读全文 »

AFL(american fuzzy lop)最初由Michał Zalewski开发,和libFuzzer等一样是基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率,从而调整输入样本以提高覆盖率,增加发现漏洞的概率。其工作流程大致如下:

  1. 从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage)
  2. 选择一些输入文件,作为初始测试集加入输入队列(queue)
  3. 将队列中的文件按一定的策略进行“突变”
  4. 如果经过变异文件更新了覆盖范围,则将其保留添加到队列中
  5. 上述过程会一直循环进行,期间触发了crash的文件会被记录下来

AFL流程

阅读全文 »

被测程序在启用libFuzzer并编译链接后,即成为了一个可接受用户参数的命令行程序,直接执行程序便是启动测试。

1. 命令统一格式

一般格式:

./fuzzer -flag1=val1 -flag2=val2 ... dir1 dir2 ...

flags代表各个控制测试过程的选项参数,可以提供零到任意个,但必须是严格的-flag=value形式,并不是很符合unix命令行习惯:

  • 选项前导用单横线,即使选项是一个词而非单个字符
  • 选项必须要提供对应的值,即使只是一个开关选项如-help,必须要写作-help=1,且选项与值中间只能用等号,不能用空格。

dirs表示语料库目录,它们的内容都会被读取作为初始语料库,但测试过程中生成的新输入只会被保存到第一个目录下。

阅读全文 »

官方文档地址

根据官方定义:libFuzzer is in-process, coverage-guided, evolutionary fuzzing engine.

其本身是llvm项目的一部分,和clang是亲兄弟,二者项目源码分别可见于https://github.com/llvm/llvm-project/tree/master/compiler-rt/lib/fuzzerhttps://github.com/llvm/llvm-project/tree/master/clang,就在同一个仓库里面。

现在稍微新的版本的clang都已经内置libFuzzer了,所以Linux下直接apt install clang就安装完事了。

1. Fuzz Target

libFuzzer要求实现一个fuzz target作为被测对象的接口。

官方文档中的代码示例如下:

// fuzz_target.cc
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
DoSomethingInterestingWithMyAPI(Data, Size);
return 0; // Non-zero return values are reserved for future use.
}

给的是个C++的源码,但实际上却通过extern "C"指定采用C风格的编译约定。所以实际上fuzz target的C语言原型如下:

int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);

名称参数返回值类型都不能动,并且注意参数中传来的字节数组Data是通过底层const修饰了的,也就是不允许修改其中数据。

fuzzer target(即LLVMFuzzerTestOneInput函数)目的是作为被测对象与libFuzzer库之间的一个中转接口,其作用在于接受libFuzzer提供的输入数据Data字节串,(可能还需要进行数据格式转换,)然后传递给实际的被测函数(如上述示例中的DoSomethingInterestingWithMyAPI)。

阅读全文 »

数据引用:bilibili AV5711740视频结束部分

阅读全文 »

对Hexo的主题进行升级,最头疼的莫过于配置文件(_config.yml)的处理。我们自己需要对它进行自定义配置,但是主题升级更新后它的内容也可能会有所改变,二者可能产生冲突。如果只是在升级后简单把旧的配置文件复制过去,当然是不合理的。

所以,正确的打开方式因该是:利用git的分支与合并功能,自动检查冲突或者快速合并。

阅读全文 »