- 文档
- 教程
- 网络安全
【免费下载链接】mastg
The OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.
本篇技术指南围绕 OWASP Mobile Application Security Testing Guide(MASTG)知识库中的符号执行(Symbolic Execution)知识条目展开,系统讲解符号执行与混合执行(Concolic Execution)的核心原理、面临的现实挑战,以及如何借助 Angr 等开源二进制分析框架在 Android 移动应用安全测试中落地实践。读完本文,你将掌握符号执行的理论模型(AST 约束生成、SMT 求解器、路径爆炸),并能照搬一个可运行的 Angr 求解脚本,自动破解原生层授权/序列号校验逻辑,为后续处理混淆过的 native 库提供自动化分析思路。
一、从文档定位看符号执行在 MASTG 中的角色
本知识条目 MASTG-KNOW-0116 归属于MASVS-RESILIENCE(抗逆向工程)类别、平台标记为 generic(通用)。这意味着符号执行不是某个平台的专有技巧,而是贯穿 Android、iOS 双平台的通用逆向分析方法。其核心用途体现在:
- 求解"到达某个代码块所需的输入":在逆向中,最耗时的任务之一是弄清楚"要让程序走到某条成功分支,输入应该是什么";
- 支撑去混淆(de-obfuscation)任务:例如简化控制流图(CFG)、逆向基于虚拟机的软件保护(VM-based protections);
- 与模拟器追踪、动态插桩等手段互补:正如 0x04c-Tampering-and-Reverse-Engineering.md 所述,"在黑客实践中一切皆可:用什么最高效就用什么。每个二进制都不同,最有效的方式往往是组合手段,例如模拟器追踪与符号执行结合"。
与符号执行强关联的仓库实践包括:
- MASTG-TECH-0037:使用 Angr 对 Android License Validator(MASTG-APP-0002)进行符号执行破解的完整 walkthrough;
- MASTG-TOOL-0030:Angr 工具条目;
- MASTG-TOOL-0073:radare2(iOS)工具条目;
- MASTG-TOOL-0098:iaito(radare2 官方 GUI)工具条目。
二、符号执行:把程序"算"出来而不是"跑"出来
2.1 核心思想:用一阶逻辑公式描述所有可能路径
文档指出,符号执行在 2000 年代末成为识别安全漏洞的主流测试手段。它的本质是:将程序可能经过的路径表示为"一阶逻辑公式"(formulas in first-order logic),再用SMT(Satisfiability Modulo Theories)求解器检查这些公式的可满足性,并给出解——包括到达执行路径上某一点所需的变量的具体取值。
通俗地说,符号执行是在数学层面分析程序而不真正执行它:
- 每个未知输入被表示成一个数学变量(符号值);
- 对这些变量执行的所有操作被记录为一棵操作树,即编译理论中的AST(抽象语法树);
- AST 被翻译成所谓的约束(constraints),交给 SMT 求解器解释;
- 分析结束时得到一个最终数学方程,方程中的变量就是值未知的输入;
- SMT 求解器解出该方程,给出在给定最终状态下各输入变量的可能取值。
2.2 最小示例:(x * y) > z
文档用了一个精炼的示意:假设某函数接收输入x,将其乘以第二个输入y,随后有一个if条件检查计算结果是否大于外部变量z的值——大于则返回 "success",否则返回 "fail"。这个运算对应的方程就是:
(x * y) > z如果我们希望该函数始终返回 "success"(最终状态),就可以让 SMT 求解器计算满足该方程的x和y取值。需要注意的是,z是外部变量(如同全局变量),其值可能在本函数之外被改变,这会导致每次执行输出不同,从而给求解正确解增加额外复杂度。文档也提示:SMT 求解器内部使用多种高级方程求解技术,这些技术的深入讨论超出了书籍范畴,读者只需理解其"求解约束、给出可行取值"的角色即可。
2.3 经典符号执行面临的四大挑战
真实世界的函数远比上述示例复杂,经典符号执行会遇到:
| 挑战 | 成因与后果 |
|---|---|
| 无限执行树 | 程序中的循环与递归可能导致执行树无限增长 |
| 路径爆炸(path explosion) | 多重条件分支或嵌套条件导致路径数量指数级膨胀 |
| 方程不可解 | 符号执行生成的复杂方程可能超出 SMT 求解器的求解能力 |
| 外部交互不可符号化 | 系统调用、库调用、网络事件无法被符号执行处理 |
三、混合执行(Concolic Execution):符号与具体的融合
为了克服路径爆炸,典型做法是将符号执行与动态执行(具体执行,concrete execution)结合,这一组合被称为concolic execution(名称源自concrete + symbolic),有时也叫动态符号执行(dynamic symbolic execution)。
以上述(x * y) > z为例:我们可以通过进一步逆向、或动态运行程序,先拿到外部变量z的具体值,再把这个信息喂给符号执行分析。额外信息能降低方程复杂度、产出更准确的分析结果。配合不断改进的 SMT 求解器与当前硬件速度,混合执行可以探索中等规模软件模块(约 10 KLOC 量级)的路径。
去混淆实战佐证:文档引用了 Jonathan Salwan 与 Romain Thomas 的工作——他们演示了如何使用动态符号执行(混合使用实际执行轨迹、模拟与符号执行)逆向基于虚拟机的软件保护(即 Triton 框架反 VM 保护的知名研究,仓库中以 [#salwan] 标注)。这说明在应对 VM 壳、控制流扁平化等混淆手段时,符号执行不仅是"找输入"的工具,更是简化控制流图、还原真实逻辑的利器。
四、框架选择:Angr 与 radare2 等开源生态
文档指出:即便大多数专业 GUI 反汇编器自带脚本与扩展能力,它们仍不适合解决特定类型的问题;而逆向工程框架允许你无需依赖重量级 GUI 就能执行并自动化任何逆向任务。多数逆向框架是开源的或免费可用的。支持移动架构的流行框架包括:
- Angr(MASTG-TOOL-0030):Python 编写的二进制分析框架,同时支持静态分析与动态符号("concolic")分析。给定二进制与目标状态,Angr 使用形式化方法(静态代码分析技术)寻找路径并结合暴力求解到达该状态,通常比手工调试、搜索路径快得多。它基于VEX 中间语言,内置 ELF/ARM 加载器,非常适合处理 native 代码(如 Android 原生二进制)。自版本 8 起基于 Python 3,可通过
pip install angr安装(*nix、macOS、Windows 均支持)。注意:Angr 的部分依赖包含 Python 模块 Z3 与 PyVEX 的分支版本,会覆盖原版,建议使用虚拟环境(Virtualenv)或官方 Docker 容器隔离。 - radare2(MASTG-TOOL-0073,iOS 版条目):完整的二进制逆向分析框架,配套官方 GUIiaito(MASTG-TOOL-0098),提供与 radare2 工作流无缝集成的图形界面,适合可视化分析 ELF 二进制。
4.1 工具组合的典型分工
从 MASTG-TECH-0037 的完整流程可以看出实际工作中的组合套路:
- 用iaito / radare2做静态分析,定位关键函数、识别输入格式(如 Base32、长度约束);
- 用Angr做符号执行引擎,自动化求解"合法输入";
- 手工分析(如解读 XOR 循环、栈布局)为符号执行提供准确的起点/终点地址——这正是混合分析(manual + symbolic)的体现。
五、实战:用 Angr 求解 Android License Validator 的合法序列号
5.1 目标程序与运行方式
MASTG-APP-0002(Android License Validator)是一个在原生代码中实现密钥校验的 crackme,打包为独立的 Android ELF 可执行文件。作者 Bernhard Mueller 设计它的初衷即在于:原生代码分析比 Java 更困难,而真实业务逻辑常以 native 形式存在——混淆代码被放进 native 库正是为了增加去混淆难度,因此掌握针对原生二进制的符号执行具有现实意义。
该二进制文件位于仓库 Crackmes/Android/License_01/validate,可通过 adb 在任意 Android 设备上运行:
$ adb push validate /data/local/tmp [100%] /data/local/tmp/validate $ adb shell chmod 755 /data/local/tmp/validate $ adb shell /data/local/tmp/validate Usage: ./validate <serial> $ adb shell /data/local/tmp/validate 12345 Incorrect serial (wrong format).此时我们对合法 license key 一无所知——这正是符号执行登场的情境。
5.2 静态分析:定位校验逻辑与输入格式
在 MASTG-TOOL-0098(iaito)中打开 ELF。main 函数位于偏移0x00001874,注意该二进制是PIE(位置无关可执行)的,iaito 选择以0x0作为镜像基址加载。函数名已被剥离,但残留的调试字符串足以提供上下文。逐点记录关键信息:
- 偏移
0x000018a8调用strlen,返回值在0x000018b0与0x10比较 →输入序列号必须是 16 字符; - 随后输入被传给偏移
0x00001340的Base32 解码函数→ 16 个 Base32 字符解码后共10 字节原始数据; - 解码结果传给偏移
0x00001760的校验函数。
上述信息直接告诉我们"预期的输入形态",接下来深入校验函数0x00001760(反汇编见 MASTG-TECH-0037)。
5.3 读懂校验函数的两个关键点
(1)XOR 解密循环(0x00001784起)
反汇编显示一个循环:在0x00001798处执行eor r3, r2, r3(XOR 运算),循环索引var_14h在0x000017d0与 4 比较、ble 0x1784循环回去——即对输入逐字节进行 XOR 变换。文档在此特意强调:XOR 是"混淆优先、安全其次"场景的常见加密手段,不应被用于任何严肃加密(频率分析即可破解),因此在校验逻辑中一旦出现 XOR 就必须给予特别关注并深入分析。
(2)逐字节比对(0x000017dc起)
XOR 解码得到的值依次与子函数调用(0x000016f0、0x0000170c、0x00001728、0x00001744)的返回值比较,任何一个不匹配(bne 0x1854)都会跳到 "Incorrect serial." 分支(0x00001854);全部通过则到达0x00001840,打印 "Product activation passed. Congratulations!"。
该函数结构并不复杂、可手工分析,但在大代码库场景下手工逐条解析既繁琐又耗时——自动化正是符号执行的用武之地。
5.4 符号执行求解脚本
Angr 引擎可通过对如下路径映射,自动确定输入串每个字节的约束:从 license 校验的第一条指令(0x00001760)到打印 "Product activation passed" 的代码(0x00001840)。初始化 Angr 需要四步:
- 加载二进制到
Project(Angr 中一切分析的起点); - 指定分析起始地址:校验函数第一条指令。跳过 Base32 实现可大幅降低求解难度;
- 指定目标地址:
0x00001840(成功消息所在代码块); - 指定回避地址:
0x00001854("Incorrect serial" 代码块)。
⚠️地址换算注意事项:Angr 加载器会把 PIE 可执行文件加载到基址0x400000,因此必须把 iaito 中的偏移加上0x400000再传给 Angr。
完整求解脚本如下(Angr 9.2.2 验证):
import angr # Version: 9.2.2 import base64 load_options = {} b = angr.Project("./validate", load_options = load_options) # The key validation function starts at 0x401760, so that's where we create the initial state. # This speeds things up a lot because we're bypassing the Base32-encoder. options = { angr.options.SYMBOL_FILL_UNCONSTRAINED_MEMORY, angr.options.ZERO_FILL_UNCONSTRAINED_REGISTERS, } state = b.factory.blank_state(addr=0x401760, add_options=options) simgr = b.factory.simulation_manager(state) simgr.explore(find=0x401840, avoid=0x401854) # 0x401840 = Product activation passed # 0x401854 = Incorrect serial found = simgr.found[0] # Get the solution string from *(R11 - 0x20). addr = found.memory.load(found.regs.r11 - 0x20, 1, endness="Iend_LE") concrete_addr = found.solver.eval(addr) solution = found.solver.eval(found.memory.load(concrete_addr,10), cast_to=bytes) print(base64.b32encode(solution))运行结果示例:
$ python3 solve.py WARNING | ... | cle.loader | The main binary is a position-independent executable. It is being loaded with a base address of 0x400000. b'JACE6ACIARNAAIIA'说明:由于存在多个合法 license key,不同运行可能得到不同解。
5.5 深入理解脚本中的关键细节
blank_state与add_options:从指定地址创建空白初始状态;SYMBOL_FILL_UNCONSTRAINED_MEMORY、ZERO_FILL_UNCONSTRAINED_REGISTERS用于处理未约束的内存/寄存器(用符号值填充或零填充),保证求解器有足够的自由度找到可行解。simulation_manager与explore:Angr 内部在起点与终点之间探索所有路径,把对应的数学方程交给求解器,返回具体有意义的结果;simgr.found列表包含满足搜索条件的所有路径。- 结果读取与 ARMv7 栈布局:脚本用
found.memory.load(found.regs.r11 - 0x20, 1, ...)取字符串地址。这并非魔法——反汇编中0x0000176c str r0, [var_20h]表明函数输入指针(寄存器 R0)被存入局部栈变量var_20h @ fp-0x20。在 ARMv7 中 R11 即 fp(帧指针),故R11 - 0x20等价于fp - 0x20,正是存放输入指针的位置。 endness="Iend_LE":指定小端序读取,Android 设备几乎全部采用小端。- 符号内存 vs 真实内存:脚本读取的是符号内存——字符串及其指针在现实中并不存在,但求解器保证给出的解与程序真实执行到该点的结果一致。用
found.solver.eval可以这样提问:"给定当前found状态下这串操作的输出,输入(addr处)必须是什么?"
得到合法序列号后,即可回到 Android 设备上运行./validate <serial>验证。文档结论值得铭记:符号执行初学时看似令人生畏,需要深入理解与大量练习,但相比逐条分析复杂反汇编指令所节省的时间,投入是值得的;实际工程中通常使用混合技巧——正如上述示例,先手工分析反汇编代码、为符号执行引擎提供准确条件,再自动化求解。
六、延伸:在 iOS 平台与更多场景中的应用
文档提示"更多 Angr 使用示例请参阅 iOS 章节"。结合仓库结构,符号执行相关能力可继续延伸至:
- MASTG-TECH-0042 / 0044 / 0046 等 iOS 技术条目:iOS 平台上类似的符号执行/二进制分析实践;
- MASTG-TECH-0119 等通用技术条目:跨平台的逆向技巧体系;
- 知识库配套条目 MASTG-KNOW-0116:即本文所依据的理论骨架,其中还给出了四大挑战的完整列表与 concolic 执行的定义,可作为持续查阅的速查卡。
从源码结构看,MASTG-TECH-0037 末尾的"混合分析"模式(手工定位 + 符号求解)是 MASTG 推荐的通用方法论:先静态识别输入格式与关键代码块,再用符号执行自动化求解约束,最后用动态执行验证结果。这套"静态 + 符号 + 动态"三阶段组合,正是应对现实世界中混淆 native 库的高效工作流。
- 文档
- 教程
- 网络安全
【免费下载链接】mastg
The OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.
相关推荐
OWASP MASTG 实战:用符号执行破解 Android License Validator 的原生 ELF 许可证校验
OWASP MASTG 实战:用符号执行破解 Android License Validator 的原生 ELF 许可证校验 导读 Android Licens
文档教程网络安全angr符号执行框架中的常见挑战与解决方案
angr符号执行框架中的常见挑战与解决方案 前言 angr作为一款强大的二进制分析框架,在符号执行、程序分析等领域有着广泛应用。然而在实际使用过程中,开发者经常
应用安全开发工具angr用户手册:二进制程序静态分析与动态符号执行详解
angr用户手册:二进制程序静态分析与动态符号执行详解 1. 什么是angr? angr是一个功能强大且用户友好的二进制分析平台(Binary Analysis
应用安全开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考