ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AFL++ 与 symqemu 集成实战:用符号执行变异器驱动更深路径发现

AFL++ 与 symqemu 集成实战:用符号执行变异器驱动更深路径发现 应用安全测试漏洞扫描【免费下载链接】AFLplusplusAFL is a state-of-the-art fuzzer, and #1 in benchmarks. It was originally based on AFL. Today it comes with qemu 5.1, collision-free coverage, enhanced laf-intel redqueen, AFLfast power schedules, MOpt mutators, unicorn_mode, and a lot more!项目地址https://gitcode.com/gh_mirrors/af/AFLplusplus点击查看免费下载本文围绕 AFL 仓库中的 symqemu 自定义变异器 展开介绍如何借助 symcc/symqemu 的 concolic混合符号执行能力为传统覆盖率引导模糊测试补充求解新路径的探索手段。读完本文你将掌握该变异器的依赖搭建、编译方法、启动命令与两个核心开关SYMQEMU_ALL、SYMQEMU_LATE并能从 symqemu.c 源码层面理解它一次完整的工作流程。一、symqemu 变异器是什么给 AFL 装上符号执行引擎AFL 原生变异器bitflip、arithmetic、havoc 等基于随机/启发式变换而 symqemu 变异器的设计目标不同——它uses the symcc to find new paths into the target即把队列中的种子交给symqemu符号执行后端做 concolic 求解用求解得到的、能穿越新分支的输入替换随机变异结果。symqemu 是 symcc 的 QEMU 形态不需要源码级插桩直接对二进制目标做动态符号执行。这决定了本变异器的适用场景目标程序无法重新编译纯二进制/黑盒目标存在深层的、难以用随机变异触达的分支条件复杂比较、哈希校验、格式解析等。仓库中还附带了一个同为 symcc 家族的 symcc 变异器其文档明确给出选型建议symqemu 变异器优于 symcc 变异器并建议优先使用 symcc、symqemu、Fuzzolic 等配套的 fuzzing helpers 体系。因此需要符号执行能力时本目录custom_mutators/symqemu/是首选入口。二、依赖准备把 symqemu-x86_64 放进 PATHREADME 的第一步要求是按 symqemu 官方仓库的构建说明编译出symqemu-x86_x64可执行文件并将其放入PATH。这一步不是可选项而是硬性前置条件——源码中对此做了强制校验。查看 symqemu.c 中afl_custom_init()的初始化逻辑char *path getenv(PATH); char *exec_name symqemu-x86_64; char *token strtok(path, :); char exec_path[4096]; while (token ! NULL >export PATH/path/to/symqemu/build:$PATH which symqemu-x86_64 # 确认能被找到三、编译与接入一条 make一个环境变量3.1 编译变异器在custom_mutators/symqemu/目录下直接执行make即可Makefile 定义的产物是symqemu-mutator.soCFLAGS -O3 -funroll-loops symqemu-mutator.so: symqemu.c $(CC) -g $(CFLAGS) $(CPPFLAGS) -g -I../../include -shared -fPIC -o symqemu-mutator.so symqemu.c编译要点-I../../include指向 AFL 根目录的include/变异器依赖afl-fuzz.h、common.h、config.h、debug.h等头文件说明它直接复用 AFL 内部数据结构afl_state_t-shared -fPIC产出共享库供afl-fuzz运行时dlopen加载需要调试输出时可带DEBUG1 make使-DDEBUG生效配合AFL_DEBUG环境变量见下文。3.2 启动命令README 给出的标准接入方式为AFL_CUSTOM_MUTATOR_LIBRARYcustom_mutators/symqemu/symqemu-mutator.so \ AFL_DISABLE_TRIM1 \ afl-fuzz ...其中AFL_CUSTOM_MUTATOR_LIBRARY是 AFL 加载自定义变异器的通用入口详见 docs/custom_mutators.md。加载后自定义变异阶段会被安排在第一个非确定性阶段即 havoc 之前运行见 src/afl-fuzz-one.c 的custom_mutator_stage标签处AFL_DISABLE_TRIM1关闭通用裁剪。symqemu 求解出的输入与普通队列文件不同通用 trimming 按位删除很可能破坏其结构、浪费执行次数因此 README 明确要求关闭。四、两个核心开关SYMQEMU_ALL 与 SYMQEMU_LATEREADME 定义了仅有的两个行为选项对应源码afl_custom_init()末段的解析if (getenv(SYMQEMU_ALL)) {>if (likely((!afl_struct-queue_cur-favored !data-all) || afl_struct-queue_cur-was_fuzzed)) { return 0; /* 默认只处理 favored 且未 fuzz 过的项 */ } if (likely(data-late)) { if (unlikely(get_cur_time() - afl_struct-last_find_time 10 * 60 * 1000)) { return 0; /* SYMQEMU_LATE最近 10 分钟内无新发现则跳过 */ } }需要注意一处文档与实现的差异供使用者在调参时参考README 将SYMQEMU_LATE描述为5 分钟没有新发现后才求解而当前仓库 symqemu.c 中实际实现的阈值为10 分钟10 * 60 * 1000毫秒。以实际代码为准。五、源码级原理一次 concolic 求解的完整生命周期整个变异器由 4 个 AFL 自定义变异 API 钩子组成对应 docs/custom_mutators.md 中的 C/C 接口规范。5.1afl_custom_init解析目标与参数准备输出目录除了第一节提到的 PATH 搜索afl_custom_init()还做了三件事读取 AFL 自动注入的辅助环境变量AFL_CUSTOM_INFO_PROGRAM被 fuzz 的目标程序路径AFL_CUSTOM_INFO_OUT本次 fuzz 会话的输出目录如-o out -S fuzzer01时为out/fuzzer01AFL_CUSTOM_INFO_PROGRAM_INPUT使用-f指定输入文件时的路径AFL_CUSTOM_INFO_PROGRAM_ARGV目标程序的命令行参数保留占位符。 这些变量是 AFL 为外部语言/工具型变异器统一提供的上下文见 docs/custom_mutators.md 的 Helpers 一节。构建 symqemu 执行参数若目标通过/-f读文件则把输入写到out/symqemu/.input并把该文件路径替换进 argv若目标从 stdin 读取则后续通过管道喂数据对应afl_struct-fsrv.use_stdin分支见 symqemu.c。设置符号执行输出目录创建out/symqemu与out/symqemu/out并通过环境变量通知 symqemusnprintf(symqemu_path, len, %s/%s, path_tmp, SYMQEMU_LOCATION); /* out/symqemu */ snprintf(data-out_dir, len, %s/out, symqemu_path); /* out/symqemu/out */ setenv(SYMCC_OUTPUT_DIR,>if (el-afl_custom_fuzz_count) { afl-stage_max el-afl_custom_fuzz_count(el-data, out_buf, len); }5.3afl_custom_fuzz逐个消费求解产物主循环对每个队列项执行stage_max次afl_custom_fuzz()。该函数再次扫描输出目录每次调用取出一个数字前缀的求解结果文件读入mutator_bufunlink删除后经*out_buf返回给afl-fuzzsymqemu.c。读取失败或无产物时返回 0表示本次变异被跳过。5.4 其余钩子afl_custom_splice_optout()声明本变异器不需要 splice拼接目标种子让afl-fuzz跳过 splice 缓冲区的准备节省时间见 docs/custom_mutators.md 中splice_optout的说明afl_custom_deinit()释放mutator_buf与data在 fuzz 会话结束时调用。六、与 symcc 变异器的关系何时用哪个同目录族的 symcc 变异器 采用完全不同的工作方式它要求目标程序先用 symcc 编译器插桩并通过SYMCC_TARGET指向插桩后的二进制。而 symqemu 变异器直接驱动 symqemuQEMU 动态二进制翻译 符号执行无需重新编译目标因此更适合黑盒场景。选型速查场景推荐目标有源码、可重新编译两者皆可symcc 插桩方案配合其 fuzzing helpers 生态更成熟目标为纯二进制、无法重编译优先 symqemu 变异器需要求解复杂条件分支、突破深层校验symqemuconcolic 求解symcc 的文档也明确写道symqemu 变异器更好佐证了 symqemu 方案在该家族中的优先地位。七、使用注意事项汇总PATH 前置afl-fuzz启动前PATH中必须存在可执行的symqemu-x86_64否则变异器初始化即FATAL退出。关闭 trimming务必设置AFL_DISABLE_TRIM1避免通用裁剪破坏 symqemu 求解结果。慎用AFL_CUSTOM_MUTATOR_ONLY源码明确警告该模式下 symqemu 效果不佳建议与内置变异器协同。产物目录约定求解结果存放在输出目录/symqemu/out/文件名以数字开头若需排查求解是否生效可观察该目录的文件生成情况。调试手段设置AFL_DEBUG1配合AFL_NO_UI可让变异器打印目标 argv、写入文件大小、求解产物数量等诊断信息make DEBUG1可启用源码中的DBG宏输出。模式语义核对SYMQEMU_LATE的 README5 分钟与当前代码实现10 分钟存在差异调参时以代码为准。综上symqemu 变异器是 AFL 自定义变异器体系中面向二进制黑盒 符号执行的一环它以极小的集成成本一个共享库、两个开关把 concolic 求解纳入 havoc 之前的确定性探索阶段为深层分支的突破提供了与随机变异互补的求解型路径发现能力。赞分享应用安全测试漏洞扫描【免费下载链接】AFLplusplusAFL is a state-of-the-art fuzzer, and #1 in benchmarks. It was originally based on AFL. Today it comes with qemu 5.1, collision-free coverage, enhanced laf-intel redqueen, AFLfast power schedules, MOpt mutators, unicorn_mode, and a lot more!项目地址https://gitcode.com/gh_mirrors/af/AFLplusplus点击查看免费下载相关推荐Zephyr 中 Ezurio RM1262 DVK 开发板指南EFR32BG22 SX1262 LoRa 的引脚映射、设备树实现与 LoRaWAN 实测Zephyr 中 Ezurio RM1262 DVK 开发板指南EFR32BG22 SX1262 LoRa 的引脚映射、设备树实现与 LoRaWAN 实测应用安全测试漏洞扫描如何通过LeetCode题解掌握路径探索算法从基础到实战的完整指南如何通过LeetCode题解掌握路径探索算法从基础到实战的完整指南 LeetCode题解项目GitHub加速计划/le/leetcode是记录解题 jou文档教程知识库如何将KLEE符号执行无缝集成到现代持续集成流程中如何将KLEE符号执行无缝集成到现代持续集成流程中 KLEE Symbolic Execution Engine是一款强大的自动化测试工具能够通过符号执行技术编译器/解释器开发工具上一篇3分钟给游戏手动升级DLSS版本DLSS Swapper 新手完整指南下一篇GloVe源码跨平台编译从Linux到macOS的适配指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表