mrphrazer/msynth

GitHub: mrphrazer/msynth

基于 Miasm 的混合布尔算术(MBA)表达式简化框架,通过预计算查找表和程序综合技术实现代码去混淆。

Stars: 355 | Forks: 29

# msynth 作者:**Tim Blazytko** 和 **Moritz Schloegel** msynth 是一个用于简化混合布尔算术(MBA)表达式的代码去混淆框架。在给定预计算简化 Oracle 的情况下,它会遍历以抽象语法树(AST)形式表示的复杂表达式,并尝试基于 Oracle 查询来简化子树。或者,它尝试通过随机程序综合来简化表达式。 msynth 构建在 [Miasm](https://github.com/cea-sec/miasm) 之上,并受到以下论文的启发: * ["QSynth: A Program Synthesis based Approach for Binary Code Deobfuscation"](https://archive.bar/pdfs/bar2020-preprint9.pdf) 作者 Robin David, Luigi Coniglio 和 Mariano Ceccato (NDSS, BAR 2020), * ["Syntia: Synthesizing the Semantics of Obfuscated Code"](https://synthesis.to/papers/usenix17-syntia.pdf) 作者 Tim Blazytko, Moritz Contag, Cornelius Aschermann 和 Thorsten Holz (USENIX Security 2017) 以及 * ["Search-Based Local Blackbox Deobfuscation: Understand, Improve and Mitigate"](https://binsec.github.io/assets/publications/papers/2021-ccs.pdf) 作者 Grégoire Menguy, Sébastien Bardin, Richard Bonichon 和 Cauim de Souza de Lima (CCS 2021). 它可以与 Miasm 的符号执行引擎结合使用,以简化混淆代码中的复杂表达式,也可以作为独立工具用于 MBA 简化的实验。 ``` original: {((((((((RSI[0:32] ^ 0xFFFFFFFF) & RDX[0:32]) + RSI[0:32]) ^ 0xFFFFFFFF) & RDX[0:32]) + ((RSI[0:32] ^ 0xFFFFFFFF) & RDX[0:32]) + RSI[0:32]) & (RDX[0:32] ^ 0xFFFFFFFF)) + -(((((((RSI[0:32] ^ 0xFFFFFFFF) & RDX[0:32]) + RSI[0:32]) ^ 0xFFFFFFFF) & RDX[0:32]) + ((RSI[0:32] ^ 0xFFFFFFFF) & RDX[0:32]) + RSI[0:32]) | (((RSI[0:32] ^ 0xFFFFFFFF) & RDX[0:32]) + RSI[0:32])) + ({RDI[0:32] & ({RDI[0:32] & RSI[0:32] 0 32, 0x0 32 64} * 0x2 + {RDI[0:32] ^ RSI[0:32] 0 32, 0x0 32 64})[0:32] 0 32, 0x0 32 64} * 0x2 + {((((RSI[0:32] ^ 0xFFFFFFFF) & RDX[0:32]) + RSI[0:32]) & RSI[0:32]) + (((RDI + {(RDI[0:32] ^ 0xFFFFFFFF) | RDX[0:32] 0 32, 0x0 32 64} + 0x1)[0:32] ^ 0xFFFFFFFF) & RDX[0:32]) + (RDI[0:32] ^ ({RDI[0:32] & RSI[0:32] 0 32, 0x0 32 64} * 0x2 + {RDI[0:32] ^ RSI[0:32] 0 32, 0x0 32 64})[0:32]) + ((RDI[0:32] ^ 0xFFFFFFFF) | RDX[0:32]) + (RDI + RDX + 0x1)[0:32] 0 32, 0x0 32 64})[0:32]) * 0x2 0 32, 0x0 32 64} simplified: {(-RDX[0:32] + ((RDI[0:32] + RDX[0:32] + RSI[0:32]) << 0x1)) * 0x2 0 32, 0x0 32 64} ``` ## 核心功能 * 简化现实中遇到的大多数 MBA * 可以将整个表达式简化为常量 * 利用大型预计算查找表(以提高效率) * 可以使用 SMT solver 验证简化的正确性 * 可以从输入输出行为中学习表达式 * 支持并行化 * 完全集成到 Miasm 的符号执行引擎中 ## 安装 要安装 msynth,请按照以下步骤操作: ``` git clone https://github.com/mrphrazer/msynth.git cd msynth # 可选:使用 virtual environment python -m venv msynth-env source msynth-env/bin/activate # 安装依赖 pip install -r requirements.txt # 安装 msynth pip install . # 解压 database unzip -d database -q database/3_variables_constants_7_nodes.txt.zip ``` ## 预计算简化查找表 要生成 Oracle,我们需要一个包含大量表达式的简化查找表(或数据库)。我们根据以下规范,使用枚举搜索预计算了 8、16、32 和 64 位大小的表达式: * 最多五个变量 `p0`、`p1`、`p2`、`p3` 和 `p4` * 截断运算符,用于将变量(如有必要)下转换为 32、16 和 8 位, * 位向量运算加法、减法、乘法、取负(一元减号)、按位与/或/异或/非以及逻辑左移, * 并且,对于某些表,包含常量 0x0, 0x1, 0x2, 0x80, 0xff, 0x800, 0xffff, 0x8000_0000, 0xffff_ffff, 0x8000_0000_0000_0000 和 0xffff_ffff_ffff_ffff。 [database](/database/) 中包含的示例数据库包含使用三个变量以及常量 0x0、0x1 和 0x2 创建的、最多 7 个节点的所有 1,293,020 种组合(例如,`((p0 + p1) * (p2 ^ 0x2))` 或 `((p0 - p2) << (p1 + p2))`)。更大的预计算数据库可以在[这里](https://share.synthesis.to/msynth/simplification_databases.7z)(~31GB 解压后)找到。请注意,用于预计算表达式的代码 __不__ 包含在此存储库中。我们计划在将来的某个时间发布它。 ## 随机程序综合 作为预计算查找表的替代方案,msynth 支持通过随机程序综合进行表达式简化。对于给定的复杂算术表达式,msynth 可以学习一个具有相同输入输出行为的更短表达式。目前,它是作为一个独立组件实现的。但是,我们计划在未来结合这两种简化方法。 ## 使用示例 首先,让我们生成一个简化 Oracle,它使用预计算的简化数据库作为输入,并将包含的表达式聚类为等价类。 ``` $ python scripts/gen_oracle.py database/3_variables_constants_7_nodes.txt oracle.pickle msynth - INFO: Computing oracle for 30 variables and 50 samples. Using library at 'database/3_variables_constants_7_nodes.txt' msynth - INFO: Writing oracle to oracle.pickle msynth - INFO: Done in 632.84 seconds ``` 根据预计算简化数据库的大小以及您的计算机性能,这可能需要几分钟或几小时。或者,您可以使用预计算的 [oracle.pickle](/oracle.pickle)。 或者,可以使用 `--sqlite` 标志生成 SQLite 格式的 Oracle,这可以实现延迟加载并显著缩短启动时间: ``` $ python scripts/gen_oracle.py database/3_variables_constants_7_nodes.txt oracle.db --sqlite ``` 之后,序列化的 Oracle 可用于简化复杂表达式: ``` from msynth import Simplifier # 初始化 simplifier simplifier = Simplifier(oracle_path) # 简化 expression simplified = simplifier.simplify(expression) ``` 或者,我们可以通过程序综合来简化复杂表达式,并学习具有相同输入输出行为的表达式: ``` from msynth import Synthesizer # 初始化 synthesizer synthesizer = Synthesizer() # 通过 program synthesis 简化 simplified = synthesizer.simplify(expression) ``` 也可以将表达式简化与 Miasm 的符号执行引擎结合使用: ``` $ python scripts/symbolic_simplification.py samples/mba_challenge 0x1290 oracle.pickle [snip] before: {({RDI[0:32] & RSI[0:32] 0 32, 0x0 32 64} * 0x2 + {RDI[0:32] ^ RSI[0:32] 0 32, 0x0 32 64})[0:32] 0 32, 0x0 32 64} simplified: {RDI[0:32] + RSI[0:32] 0 32, 0x0 32 64} [snip] ``` 更多使用示例可以在 [scripts](/scripts) 目录中找到。 ## 限制与未来工作 * 不支持部分常量的综合 * 对截断和零/符号扩展的支持有限 * 预计算表可能不完整 ## 联系方式 欲了解更多信息,请联系 Tim Blazytko ([@mr_phrazer](https://twitter.com/mr_phrazer)) 或 Moritz Schloegel ([@m_u00d8](https://twitter.com/m_u00d8))。
标签:AST抽象语法树, CTF安全工具, DNS 反向解析, MBA表达式化简, Miasm, Oracle简化, QSynth, Syntia, 二进制安全, 云安全监控, 云资产清单, 代码反混淆, 恶意代码分析, 无线安全, 混淆还原, 程序合成, 符号执行, 自动化去混淆, 逆向工具, 逆向工程, 配置文件, 随机搜索, 静态分析