quarkslab/qsynthesis

GitHub: quarkslab/qsynthesis

一个基于灰盒程序合成方法的二进制代码去混淆框架,用于将复杂的混淆汇编指令还原为语义等价的简洁表达式。

Stars: 169 | Forks: 18

# Qsynthesis QSynthesis 是一个用于执行基于 I/O 的位向量(bitvector)表达式程序合成的 Python3 API。它旨在促进代码去混淆(deobfuscation)。 该算法采用灰盒(greybox)方法,结合了基于黑盒 I/O 的合成与白盒 AST 搜索来合成子表达式*(如果根节点无法合成)*。 该算法最初在 BAR 学术研讨会上进行了描述: * [QSynth: A Program Synthesis based Approach for Binary Code Deobfuscation](https://archive.bar/pdfs/bar2020-preprint9.pdf) (使用的基准测试可在[此处](https://github.com/werew/qsynth-artifacts)获取) 该代码作为以下 Black Hat 演讲的一部分发布: * [Greybox Program Synthesis: A New Approach to Attack Dataflow Obfuscation](https://www.blackhat.com/us-21/briefings/schedule/index.html#greybox-program-synthesis-a-new-approach-to-attack-dataflow-obfuscation-22930) **免责声明:此框架为实验性质,仅应用于实验目的。其主要旨在激发该领域的研究。** ## 文档 安装、示例和 API 文档可在专用文档页面找到:[Documentation](https://quarkslab.github.io/qsynthesis) ## 功能 核心合成基于 [Triton](https://triton.quarkslab.com) 符号执行引擎,整个框架均构建于此之上。它提供以下功能: * 位向量表达式的合成 * 能够通过 SMT 检查合成表达式的语义等价性 * 能够合成常量*(如果表达式编码了一个常量)* * 能够通过学习机制随时间改进预言机(oracles,预计算表) * 能够将合成表达式重新汇编回汇编代码 * 能够通过 REST API 提供预言机服务以简化合成使用 * 提供集成合成功能的 IDA 插件 ## 快速开始 ### 安装 为了正常工作,首先需要安装 Triton:[install documentation](https://triton.quarkslab.com/documentation/doxygen/index.html#install_sec)。 Triton 不会自动安装在 virtualenv 中,请将其复制到您的 venv 中,或者在配置 venv 时使用 --system-site-packages。 然后: ``` $ git clone https://github.com/quarkslab/qsynthesis.git $ cd qsynthesis $ pip3 install '.[all]' ``` ``[all]`` 将安装所有依赖项*(有关轻量级安装,请参阅文档)*。 ### 表生成 合成算法需要生成源自文法*(一组变量和运算符)*的预言机(oracle)表。Qsynthesis 安装提供了 ``qsynthesis-table-manager`` 实用程序来操作表。以下命令生成一个包含 3 个 64 位变量、5 个运算符的表,使用 16 个输入的向量。我们将生成限制为 500 万条目。 ``` $ qsynthesis-table-manager generate -bs 64 --var-num 3 --input-num 16 --random-level 5 --ops AND,NEG,MUL,XOR,NOT --watchdog 80 --limit 5000000 my_oracle_table Generate Table Watchdog value: 80.0 Depth 2 (size:3) (Time:0m0.23120s) Depth 3 (size:21) (Time:0m0.23198s) Depth 4 (size:574) (Time:0m0.26068s) Depth 5 (size:400858) (Time:0m21.23231s) Threshold reached, generation interrupted Stop required Depth 5 (size:5000002) (Time:4m52.56009s) [RAM:9.52Gb] ``` 注意:生成过程非常消耗 RAM,``--watchdog`` 允许设置一个 RAM 百分比,超过该百分比将中断生成。 ### 合成位向量表达式 然后我们可以尝试简化一个看似混淆的表达式: ``` from qsynthesis import SimpleSymExec, TopDownSynthesizer, InputOutputOracleLevelDB blob = b'UH\x89\xe5H\x89}\xf8H\x89u\xf0H\x89U\xe8H\x89M\xe0L\x89E\xd8H\x8bE' \ b'\xe0H\xf7\xd0H\x0bE\xf8H\x89\xc2H\x8bE\xe0H\x01\xd0H\x8dH\x01H\x8b' \ b'E\xf8H+E\xe8H\x8bU\xe8H\xf7\xd2H\x0bU\xf8H\x01\xd2H)\xd0H\x83\xe8' \ b'\x02H!\xc1H\x8bE\xe0H\xf7\xd0H\x0bE\xf8H\x89\xc2H\x8bE\xe0H\x01\xd0' \ b'H\x8dp\x01H\x8bE\xf8H+E\xe8H\x8bU\xe8H\xf7\xd2H\x0bU\xf8H\x01\xd2' \ b'H)\xd0H\x83\xe8\x02H\t\xf0H)\xc1H\x89\xc8H\x83\xe8\x01]\xc3' # 执行指令的符号执行 symexec = SimpleSymExec("x86_64") symexec.initialize_register('rip', 0x40B160) # arbitrary address symexec.initialize_register('rsp', 0x800000) # arbitrary stack symexec.execute_blob(blob, 0x40B160) rax = symexec.get_register_ast("rax") # retrieve rax register expressions # 加载查找表 ltm = InputOutputOracleLevelDB.load("my_oracle_table") # 执行表达式合成 synthesizer = TopDownSynthesizer(ltm) synt_rax, simp = synthesizer.synthesize(rax) print(f"expression: {rax.pp_str}") print(f"synthesized expression: {synt_rax.pp_str} [{simp}]") ``` ## 限制 * 合成准确性受限于预计算表的详尽程度 * 表生成受限于 RAM 消耗 * 重汇编不能涉及内存变量,目标必须是寄存器,且架构取决于 llvmlite *(因此主要是 x86_64)* * 代码引用了基于跟踪的合成,该功能已被禁用*(因为底层框架尚未开源)* ## 作者 * Robin David (@RobinDavid), Quarkslab ## 贡献者 非常感谢对此研究做出贡献的人员: * Luigi Coniglio * Jonathan Salwan
标签:API安全, AST搜索, DNS 反向解析, IDA插件, JSON输出, Python, SMT求解器, Triton, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 代码去混淆, 位向量, 恶意代码分析, 无后门, 汇编指令, 灰盒测试, 白盒测试, 程序合成, 符号执行, 逆向工具, 逆向工程, 配置文件, 静态分析, 黑盒测试