LLVM + libFuzzer 使用方法

这个,其实挺坑的。使用方法很诡异。

首先

https://www.cnblogs.com/suanguade/p/13833360.html

用以上帖子的方法,重新完整编译LLVM的项目,

其实也不用太完整,主要是需要集成

”Compiler-RT“相关的库,

因为 libFuzzer 相关的功能都在这个库里。

 

以上都做完了之后,需要使用的模块大致有三个

1:生成出来的 clang.exe 

2:RTfuzzer_main.x86_64.lib 库

3:RTfuzzer.x86_64.lib 库

 

三个模块分别有不同的用途。

模块1:是编译器,编译fuzzer程序,需要使用模块1

模块2:是main函数库,最大的用途是,帮助我。。。让我少写个main函数,其实也没啥用

模块3:是主要的 Fuzz 库,相关功能都在里面

 

都有了之后,写代码。

 1 #include <stdio.h>
 2 
 3 typedef unsigned char uint8_t;
 4 typedef unsigned __int64 size_t;
 5 
 6 extern "C" int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {
 7     char z = 'z';
 8     char* sz = (char *)z;
 9     *sz = (char )*data;
10     printf("123\n");
11     return 0;
12 }

就这点代码,就够了。

稳定必崩。

然后使用clang 编译,命令如下:

clang++.exe -LL:\LLVM\llvm-11.0.0.src\project\projects\compiler-rt\lib\fuzzer\RTfuzzer_main.x86_64.dir\RelWithDebInfo\RTfuzzer_main.x86_64.lib -LL:\LLVM\llvm-11.0.0.src\project\projects\compiler-rt\lib\fuzzer\RTfuzzer.x86_64.dir\RelWithDebInfo\RTfuzzer.x86_64.lib -fsanitize=fuzzer -fsanitize=address main.cpp

看起来挺长的,其实主要部分就三块。

导入两个lib,传入一个cpp文件来编译,然后就是编译参数

编译完之后,程序就出来了,程序很大。。。

LLVM + libFuzzer 使用方法

 

 

执行程序,代码必崩

LLVM + libFuzzer 使用方法

 

 

如果要复现这个崩溃,只需要执行的时候加个参数就好了,比如

LLVM + libFuzzer 使用方法

 

 

我代码写的问题,所有参数都崩,所以我随便怎么加参数都崩,所以就这样了,

如果需要看帮助,可以这样

LLVM + libFuzzer 使用方法

 

 

好了,就是这么玩的,

其他代码细节就太简单了,看下代码就会了。

结束了,玩完了,没准可以用它玩玩别的代码呢。

上一篇:编译器架构的王者LLVM——(6)多遍翻译的宏翻译系统


下一篇:iOS业务模块化利用CocoaPod入门实践