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.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)...
很显然,只要输出指定字符串,程序就会访问到非法内存,同时程序根据输入头部的不同产生多个分支,从而测试AFL输入样本的变异过程。 编译中程序显示对52处位置进行了插桩。 把编译得到的文件丢进IDA,可以发现编译生成的函数中有多个__afl_maybe_log,显然他们由afl-gcc的...
Hello~我是一名学习fuzz技术的小白,在这里记录一下学习 afl-fuzz.c 的笔记和心得! 但是 afl-fuzz.c 的源程序足有8198行…… 所以我就拆分开一部分一部分进行记录噜~ 建议:可以使用 Visual Studio Code 或者 C…
通过源码阅读首先找到afl-fuzz.c的main函数开始阅读: afl-fuzz.c->mian()-> init_forkserver() ->父进程->等待子进程目标程序运行起来发来信号 ->子进程fork() -> execv(target_path, argv); 在开启forkserver的情况下,目标程序会启动子进程,而父进程负责控制子进程. ...
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 工作流 命令afl-fuzz -i in -o out ./fuzzer运行后,其中-i指定in目录是种子输入文件目录,-o指定out目录是输出文件目录,fuzzer是经过编译插桩的二进制文件,是待模糊测试的目标。 afl-fuzz的整个模糊测试流程如下图所示,可以概括为: 基于源码编译生成支持反馈式模糊测试的二进制程序(第一部分介绍过的afl...
然后调用fuzz_one()进行对样本进行变异fuzz,返回skipped_fuzz, 判断skipped_fuzz的返回值,判断是否退出fuzz还是,fuzz队列的下一个样本 主循环结束后,摧毁内存空间,关闭描述符,输出和更新一些状态 这里就不得不提到fuzz_one()函数的一些细节了(变异的过程也在这部分源代码) ...
afl-fuzz源码分析GCC编译流程预处理(Preprocessing):对源代码进行预处理,如宏替换、条件编译等,生成经过预处理的源代码。预处理可以通过gcc -E命令单独执行。编译(Compil