作为Jazzer的模糊测试目标,FuzzerTarget类必须定义以下两个函数之一:
public static void fuzzerTestOneInput(byte[] ...)
public static void fuzzerTestOneInput(FuzzedDataProvider ...)
FuzzedDataProvider类是Jazzer提供的用于获取模糊测试数据的工具类。以下是一些常用的方法:
consumeInt(): 以模糊方式获取一个32位整数。
consumeLong(): 以模糊方式获取一个64位长整数。
consumeBoolean(): 以模糊方式获取一个布尔值。
consumeFloat(): 以模糊方式获取一个32位浮点数。
consumeDouble(): 以模糊方式获取一个64位双精度浮点数。
consumeBytes(int count): 以模糊方式获取指定长度的字节数组。
consumeString(int length): 以模糊方式获取指定长度的字符串。
一、简单的接口测试
1、提供测试代码
import com.code_intelligence.jazzer.api.FuzzedDataProvider; public class FuzzerTarget { // Your fuzzing target logic public static void fuzzerTestOneInput(FuzzedDataProvider data) { // Use FuzzedDataProvider to get fuzzed data int intValue = data.consumeInt(); byte[] byteArray = data.consumeBytes(10); // Print fuzzed data System.out.println("Fuzzing input - intValue: " + intValue); System.out.println("Fuzzing input - byteArray: " + byteArray); throw new RuntimeException("Input 'a' should be less than or equal to 10"); // Your fuzzing logic here // ... } // fuzzerInitialize method public static void fuzzerInitialize() { // Initialization logic, if needed System.out.println("Initialization logic in fuzzerInitialize"); } public static void main(String[] args) { // Example fuzzing target int result = add(5, 3); System.out.println("Result: " + result); } } |
2、生成class文件
javac -cp jazzer_standalone.jar FuzzerTarget.java |
3、使用jazzer测试
./jazzer --cp=/home/jazzer_lch --target_class=FuzzerTarget |
4、查看结果
结果文件跟源文件的关系:结果文件保留了导致源文件异常的数据,并可以重现异常现象
代码中,类内提供的测试入口内抛出了异常
fuzzerTestOneInput |
故程序执行失败,产生由内容- SHA-1 散列结果命名的java文件。文件是一个重现文件,期内部逻辑为先调用待测类注册的关于模糊测试初始化接口fuzzerInitialize,如果没有则调用内置接口。接下来调用待测类提供的测试接口,并传入此前导致退出的测试数据。
5、重现问题
将产生的结果文件重新编译,通过-cp 包含jazzer_standalone.jar:.,通过
java -cp .:jazzer_standalone.jar Crash_da39a3ee5e6b4b0d3255bfef95601890afd80709 |