当前位置: 首页 > news >正文

QSYM 核心架构全解析:从 PIN 插桩到 Z3 求解

QSYM 核心架构全解析:从 PIN 插桩到 Z3 求解

【免费下载链接】qsymQSYM: A Practical Concolic Execution Engine Tailored for Hybrid Fuzzing项目地址: https://gitcode.com/gh_mirrors/qs/qsym

QSYM 是一款面向混合模糊测试(Hybrid Fuzzing)的实用化符号执行引擎,它的核心价值在于把传统模糊测试的"暴力枚举"与符号执行的"精确求解"结合起来,大幅提升漏洞挖掘效率。本文将从底层动态插桩到上层约束求解,完整拆解 QSYM 的核心架构,帮助你理解它"如何做到既快又准"。

什么是 QSYM:混合模糊测试的加速器

在解释架构之前,先明确 QSYM 的定位。QSYM 全称是A Practical Concolic Execution Engine Tailored for Hybrid Fuzzing,由 Georgia Tech 团队提出并发表于 USENIX Security 2018。

传统模糊测试(如 AFL)靠随机变异输入来探索程序,速度快但遇到复杂的魔法值比较(如if (x == 0xdeadbeef))就很容易卡住;而经典符号执行能精确求解路径约束,却因为性能开销大而难以大规模落地。QSYM 的策略是取两者之长:让 AFL 负责大规模随机探索,让 QSYM 在后台做快速的符号执行,一旦发现 AFL 难以通过的"深水区"分支,就生成新输入交给 AFL 继续跑,从而形成正向循环。

QSYM 的整体架构:四层流水线

QSYM 的代码仓库结构清晰地反映了它的分层设计,核心源码位于 qsym/pintool/ 目录下,大致可以抽象为四层流水线:

  1. 插桩层:基于 Intel PIN 的动态二进制插桩,捕获每条指令的执行轨迹;
  2. 符号执行层:把影响控制流的数据抽象为符号表达式,追踪内存与寄存器的依赖关系;
  3. 约束求解层:把路径条件交给 Z3 求解器,反解出能触发新分支的输入;
  4. 协同层:通过共享的 AFL 覆盖率位图与队列文件,实现与 AFL 的双向协作。

下面逐层深入。

第一层:PIN 动态二进制插桩,捕获执行轨迹

QSYM 之所以比传统符号执行快一个数量级,关键在于它不需要对目标程序做任何源码改动或重编译,而是借助 Intel PIN 在运行时直接插桩。

入口在 main.cpp:程序先调用PIN_InitSymbols()PIN_Init()完成 PIN 运行环境初始化,然后通过hookSyscalls()挂钩系统调用(支持 stdin、文件、网络三种输入来源),最后调用initializeQsym()注册插桩回调并执行PIN_StartProgram()启动目标程序。

QSYM 在插桩阶段会重点做两件事:

  • 指令级追踪:分析每条指令的语义(如 analysis_instruction.cpp 中的指令建模),判断其是否依赖符号数据;
  • 污点式内存建模:通过 memory.cpp 维护一个页表级的内存抽象,精确记录符号数据在内存中的分布,避免对整个地址空间做符号化,从而控制性能开销。

这张图展示了在开发环境中通过调试器挂载 PIN 插桩工具的场景——QSYM 的插桩层就是以这样的方式附着在目标进程之上的。

第二层:符号表达式构建,把数据变成数学

拿到执行轨迹后,QSYM 需要把"影响分支的数据"抽象成符号表达式,这一层对应 expr.h 和 expr_builder.cpp。

你可以把符号表达式想象成"带未知数的算式":程序读入的输入被当作符号变量,而所有运算(加、减、乘、移位、位运算、比较等)都被翻译成对应的符号操作节点。例如x = input[0] + 1会被建模为一个Add(Read(0), 1)的表达式树。

这一层有两个值得关注的设计细节:

  • 表达式缓存expr_cache.cpp负责复用结构相同的子表达式,避免重复构建,显著降低内存与时间开销;
  • 约束剪枝PruneExprBuilder会利用 LLVM 的区间分析(见 third_party/llvm/range.cpp)提前判断约束是否可能满足,把明显无解的分支直接丢弃,减少无效求解。

正是因为有了表达式复用与区间剪枝,QSYM 才能在保持较高覆盖能力的同时,把单次执行的开销压到接近原生运行水平。

第三层:Z3 约束求解,反推出新输入

当程序执行到条件跳转(JCC)时,QSYM 会收集当前的路径约束并尝试"反向求解",这部分核心逻辑在 solver.cpp 中,求解器本身采用微软的Z3(仓库 third_party/z3/)。

求解流程大致如下:

  1. 判断兴趣分支:通过isInterestingJcc()判断当前分支是否值得求解(结合 AFL 位图判断该分支是否带来新的覆盖率);
  2. 收集并同步约束syncConstraints()会把当前路径上积累的符号约束统一加入 Z3 求解器;
  3. 取反路径条件negatePath()将分支条件取反,迫使求解器生成一条与当前执行方向不同的新输入;
  4. 求值并落盘solveOne()调用 Z3 得到具体解后,通过saveValues()把新输入写入 QSYM 的测试用例目录,等待 AFL 拾取。

为了进一步提速,QSYM 对约束做了大量轻量化处理:能通过区间分析直接得出结果的就不调用 Z3,同时支持求解结果缓存,避免同一约束反复求解。

第四层:与 AFL 的混合协作,跑出 1+1>2

架构的最后一层是 QSYM 与 AFL 的协同机制,这也是"混合模糊测试"名称的由来。

协同的关键在于 afl_trace_map.cpp:QSYM 会直接读取并更新 AFL 的覆盖率位图。当 QSYM 通过符号执行发现新的覆盖路径时,它会同步更新位图,让 AFL 认为"找到了新兴趣",从而把注意力引导到这些新区域;反过来,AFL 产生的新种子又会成为 QSYM 符号执行的输入,形成双向互补。

在运行层面,仓库根目录的 qsym/afl.py 与bin/run_qsym_afl.py脚本负责编排整个流程:启动一个 AFL master、一个 AFL slave 和一个 QSYM 进程,让它们共享同一个输出目录,QSYM 生成的测试用例会进入 AFL 的队列等待变异复用。

上图演示的是调试器附加 PIN 进程的参数设置,在实际运行中,run_qsym_afl.py正是通过类似的参数把 PIN 插桩工具附加到目标二进制上。

环境搭建与快速上手

QSYM 基于较老的 PIN 版本构建,官方推荐在 Ubuntu 14.04/16.04 64 位环境中使用。如果你希望快速体验,最简单的方式是使用仓库自带的 Docker 配置(Dockerfile):

git clone https://gitcode.com/gh_mirrors/qs/qsym cd qsym echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope docker build -t qsym ./ docker run --cap-add=SYS_PTRACE -it qsym /bin/bash

注意:由于 PIN 依赖ptrace,运行前必须关闭系统的ptrace_scope限制,否则插桩无法附加到目标进程。

总结:一套值得借鉴的混合执行设计

回顾整个架构,QSYM 的每一个设计决策都围绕"实用化"展开:用 PIN 插桩解决源码不可得的问题,用污点内存建模和区间剪枝控制符号化开销,用 Z3 提供精确求解能力,再用 AFL 位图打通与模糊测试的协作通道。

对于安全研究人员而言,QSYM 的价值不仅在于它本身是一款高效的混合模糊测试引擎,更在于它的架构为"如何把符号执行落地到真实漏洞挖掘"提供了完整范本——从插桩到求解的每一层,都值得深入研读。

【免费下载链接】qsymQSYM: A Practical Concolic Execution Engine Tailored for Hybrid Fuzzing项目地址: https://gitcode.com/gh_mirrors/qs/qsym

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/1405094/

相关文章:

  • SmartBugs 跨平台安装终极指南:Windows/macOS/Linux 避坑全攻略
  • 5步搭好免费自托管游戏串流服务:Sunshine 从安装到畅玩全指南
  • SCOOP多机部署实战:用SSH与hostfile构建分布式集群
  • iPhone远程控制安卓手机:Scrcpy-iOS跨平台远程控制从零上手
  • 2026单轴转台选购指南:精度、传动与厂家盘点
  • MiniMax Music 3 环境搭建教程:SGLang-Omni 部署与 API 调用从零开始
  • 【b站咸虾米】3 Vue CLI脚手架 2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例
  • GetQzonehistory 实测:3分钟一键导出QQ空间全部说说,永久封存你的青春记忆
  • 2026年有医疗认证的UE Electronic相关企业选购参考榜 - 滚动商讯
  • 自指递归结构驱动认知流形可穿越虫洞形成机制(SH9认知几何学框架深化研究版)——算子表示、场方程、拓扑动力学与可验证实验方案
  • 2026 八月最新唐山下水道疏通上门维修冻管处理测漏异物打捞商家盘点 - 启航优客
  • 着眼长久陪伴,挑选能够共度漫长时光的家庭幼犬 - 北京同城宠物基地
  • 内蒙古旅行不想跟购物团?这7位正规持证导游,建议先收藏 - 纯玩旅游分享
  • 安卓文件同步工具实战全攻略:一台手机一台电脑,让数据直连互传不再求人
  • 字体模糊的终极解药:用MacType字体渲染优化工具,3步让Windows文字清晰锐利
  • 2026 八月最新唐山管道上门疏通马桶维修冻堵处理测漏异物打捞商户参考 - 启航优客
  • 别墅铸铝门厂家推荐:5 家源头品牌实力对比 - 门业测评
  • 抖音下载工具 douyin-downloader 完整上手指南:免费开源,无水印批量下载一次搞定
  • 认知几何学通过认知纤维丛形式化框架预测认知相变中神经表征拓扑突变的深入研究报告
  • NXP RT1060学习总结 - CAN功能细节
  • MEGABYTE-pytorch性能优化:开启Flash Attention让长序列训练速度翻倍
  • 你的抖音视频为什么总带水印?开源免费工具一键搞定批量保存
  • 2026年跨省寄被褥用什么物流?选对渠道省下一半运费 - 快递物流资讯
  • AI推动工业智能化转型~系列文章24:钢铁工业 AI 全景图:从原料场到轧机的场景地图
  • 解密map-vectorizer核心流水线:从GIMP阈值化到R多边形简化的6个关键步骤
  • 2026新疆和田玉成品店铺名录:3家合规**企业参数对比 - 互联网科技品牌测评
  • 免费抖音批量下载工具,5分钟上手不踩坑
  • go metrics的数据如何收集展示
  • UE里怎么播放视频和打开外部网页
  • DBeaver 保姆级使用教程(社区版 DBeaver CE,开发通用)