1.源码编译插桩:使用 afl++ 自带的插桩编译器:afl-gcc(还有很多其他的插桩编译器现以这个举例) [AFL++ 405757f4e3c5] ~/work/test2 # afl-gcc ./test2.c -o ./stackoverflow afl-cc++4.22a by Michal Zalewski, Laszlo Szekeres, Marc Heuse - mode: G...
一、afl-fuzz.c的匿名枚举(Line 298 - 338) /* Fuzzing stages */// 这段代码定义了一个枚举(enum),它列出了 AFL模糊测试过程中的不同阶段。这个是一个匿名枚举。// 每个阶段代表了 AFL 在模糊测试中采取的特定策略或操作。理解这些阶段有助于深入了解 AFL 如何对测试用例进行变异以探索新的程序行为和潜在...
这里说的是,afl-fuzz的可执行文件,是以“已经通过afl插桩的二进制文件”作为输入,通过模糊测试的各种技巧,检测如何影响改变执行路径。#define AFL_MAIN// 定义这个AFL_MAIN,但未给这个AFL_MAIN赋值。一般用于在其他文件中,这个宏可以用来判断 afl-fuzz.c 是否被包含,从而决定是否执行特定的代码//搭配 `#ifdef AFL...
afl-fuzz.c详解 main函数中fuzz主循环 第一次循环 while(1){ u8 skipped_fuzz; cull_queue();//精简队列skipped_fuzz=fuzz_one(use_argv);//fuzz_one不执行为1,否则返回0if(!stop_soon&&sync_id&&!skipped_fuzz){//fuzz_one未执行if(!(sync_interval_cnt++ %SYNC_INTERVAL)) sync_fuzzers(use_argv)...
然后调用fuzz_one()进行对样本进行变异fuzz,返回skipped_fuzz, 判断skipped_fuzz的返回值,判断是否退出fuzz还是,fuzz队列的下一个样本 主循环结束后,摧毁内存空间,关闭描述符,输出和更新一些状态 这里就不得不提到fuzz_one()函数的一些细节了(变异的过程也在这部分源代码) ...
afl-fuzz源码分析GCC编译流程预处理(Preprocessing):对源代码进行预处理,如宏替换、条件编译等,生成经过预处理的源代码。预处理可以通过gcc -E命令单独执行。编译(Compil
0x02 afl-fuzz源码分析(第一部分) main函数(第一部分) banner& 随机数生成 首先是函数入口,程序首先打印必要的提示信息,随后依据当前系统时间生成随机数。 SAYF(cCYA"afl-fuzz "cBRI VERSION cRST" by <lcamtuf@google.com>\n"); doc_path = access(DOC_PATH, F_OK) ?"docs": DOC_PATH; ...
通过源码阅读首先找到afl-fuzz.c的main函数开始阅读: afl-fuzz.c->mian()-> init_forkserver() ->父进程->等待子进程目标程序运行起来发来信号 ->子进程fork() -> execv(target_path, argv); 在开启forkserver的情况下,目标程序会启动子进程,而父进程负责控制子进程. ...
解决方案,创建afl++的docker容器可在命令行运行以下命令: docker run name afl -it -d aflplusplus/aflplusplus /bin/bash AFL++进行漏洞挖掘实战 (一)目标程序的源码 这是一个普通的栈溢出案例,添加了一点点的if判断语句用来模拟正常程序: //test2.c ...
afl-fuzz 工作流 命令afl-fuzz -i in -o out ./fuzzer运行后,其中-i指定in目录是种子输入文件目录,-o指定out目录是输出文件目录,fuzzer是经过编译插桩的二进制文件,是待模糊测试的目标。 afl-fuzz的整个模糊测试流程如下图所示,可以概括为: 基于源码编译生成支持反馈式模糊测试的二进制程序(第一部分介绍过的afl...