Capstone 反汇编引擎 NGUYEN Anh Quynh, Coseinc <aquynh -at- gmail.com> Syscan360 Beijing, July 16th 2014 1/46
目录 1 反汇编引擎和他们的问题 2 3 4 5 6 Capstone: 总体思路和设计 Capstone 目标 Capstone 设计 Capstone 实现 一些不好处理的 X86 指令 2/46 应用 总结.
Capstone 背后的故事 我的项目需要一个好的反汇编框架 (2013) X86 + ARM Windows + Linux 友好的许可 ( 非 GPL) 很遗憾, 在 2013 年这样的东西不存在! 3/46
二进制分析和漏洞利用 二进制分析 逆向二进制代码 ( 例如恶意软件 ) 更好的理解内部信息 分析二进制代码来寻找脆弱性 调试机器码 机器级的代码是唯一的输入 采用汇编代码是唯一的选择 漏洞利用 编写软件脆弱性的利用 构建 shellcode 是利用的重要一部分 机器级的 shellcode 是强制的 采用汇编代码是唯一的选择 4/46
反汇编机器码 所有二进制分析 / 逆向工具 / 漏洞利用开发的核心部分 反汇编框架 ( 或库 ) 是整个结构中的更底层部分 5/46
建立反汇编框架 6/46 需要对硬件结构和指令集有好的理解 在反汇编时, 恰当的解码二进制代码 为使应用获得内部指令信息, 要分解汇编的细节
建立反汇编框架是乏味烦人的 大量的时间花费在理解指令编码方案 太多需要处理的指令 太多的特例和文档未说明的指令 (X86) 太多架构 :X86,Arm,Arm64,Mips,PPC,Sparc,etc. 语言绑定 (bindings) 件编译困难 :Python,Ruby,Java,C#,Javascript, etc 7/46
需要好的反汇编框架 安全界长期存在的问题 - 即使 2013 年仍然没有解决好 简单的要求 多架构 :X86 +Arm 对新架构变化的积极维护和升级 多平台 :Windows +Linux 支持 Python +Ruby 语言编译 友好的许可 (GPL 不好!) 黑暗的隧道里没有光明 - 直到 Capstone 的到来! Capstone Disassembly 8/46 Engine
其它 1 Poor quality
困难 都失败了 显然都不想去修复这些问题 黑暗的隧道尽头没有亮光 10/46
Capstone = 下一代的反汇编框架! 11/46
Capstone 的目标 多架构 : X86 + Arm + Arm64 + Mips + PPC (object surpassed eventually) 多平台 : Windows + MacOSX + Linux + ios + Android + *BSD. 多绑定 (bindings): Python + Ruby + Java + JavaScript + C#. 干净 简单 直观 结构无关的 API. 提供指令的分解细节 友好的许可 :BSD 12/46
困难 13/46 多架构 : 太多工作 多平台 : 太多工作 多绑定 (bindings): 太多工作 利用非常有限的资源完成可能要若干年
但是奇迹发生了 :Capstone 做到了! 14/46
时间线 2013 年 8 月 : 开始设计实现 2013 年 11 月 : 公开测试请求 2013 年 12 月 : 作为开源项目发布 1.0 版本 2014 年 1 月 : 2.0 版本发布 2014 年 3 月 : 2.1 版本发布 2014 年 4 月 : 2.1.2 版本发布 2014 年 8 月 : 3.0 RC1 版本发布 ( 试验性的 ) 开始被重要的工具广泛的采用, 训练并工作在很多地方 对于重要的操作系统的包已经可用 (Windows, MacOSX, Linux, *BSD) 15/46
Capstone 7 个月的状态 多架构 : 仅次于 *Libopcode*, 但是更多更新更准确 多平台 : 首屈一指 (Windows, OSX, Linux, *BSD, ios, Android, Solaris) 多绑定 (bindings): 首屈一指 (9 languages supported besides *C*) 比其它的提供更多的分解的指令细节 更新 : 比其它的都多 (X86, Arm, Arm64, Mips, PPC, Sparc, SystemZ & XCore) 成熟度 : 处理更多的复杂 X86 指令 文档 : 大量关于安装 / 编译 / 绑定 (bindings)/ 编程的文章 16/46
Capstone versus others Capstone 的绑定 (bindings): Python, Ruby, C++, C#, Java, NodeJS (JavaScript), GO, OCaml & Vala. Distorm3 的绑定 (bindings): Python, Ruby (poor quality), Java, C#. 其它的绑定 (bindings): Python. 17/46
Capstone 设计 18/46
目标 1 年内具备所有想要的特性 利用非常有限的资源 不可能完成的梦? 19/46
困难 多架构 : 太多工作! 多平台 : 太多工作! 多绑定 (bindings): 太多工作! 利用非常有限的资源, 真的可能在若干年完成? 20/46
野心和想法 几个月内实现所有特性 初始阶段站在巨人的肩膀上 开源项目来获得社区的参与和贡献 21/46
LLVM 的介绍 LLVM 项目 编译器的开源项目 :http://www.llvm.org 建立编译器的框架集合 机器码的表达 编译 优化的模块集合 许多主流厂商的支持 :AMD,Apple,Google,Intel,IBM, ARM,Imgtec,Nvidia,Qualcomm,Samsung,etc. 无比巨大的相关 ( 编译器 ) 社区 22/46
LLVM 模块 编译模型 LLVM 模块 : 分离的前端 - 优化 后端 23/46
为什么选择 LLVM? 支持多架构 机器编码 (MC) 模块中可用的内部反汇编 ( 只支持 LLVM 模块 ) Ø LLVM 严密的设计和实现 Ø 巨大的社区进行积极的维护和更新 BSD 许可 利用 LLVM 的 MC 来建立 Capstone! 挑选那些有反汇编器的架构 : 目前是 8 种 24/46
LLVM 的机器编码 (MC) 层 集成含有内部反汇编器的编译器的 LLVM 核心层 用作编译器 汇编器 反汇编器 调试器和 JIT 编译器 以一个大的机器指令描述表 (TableGen) 为中心 自动生成汇编器 反汇编器和 TableGen 的代码输出 (*.inc) 25/46
优势 已经被大量测试用例测过的高质量代码 各个架构的顶级专家维护的反汇编器 Ø X86: Intel 维护 ( 架构创造者 ). Ø Arm+Arm64: Arm & Apple 维护 ( 架构创造者和 Arm64 的设备制造商 ). Ø Mips: Imgtec 维护 ( 架构创造者 ) Ø SystemZ: IBM 维护 ( 架构创造者 ) Ø XCore: Xmos 维护 ( 架构创造者 ) Ø PPC & Sparc: 高活跃度社区 新指令和 bug 被很快的修复! bug 会被很快的报给我们或者上游代码, 然后反馈回来 27/46
问题 不可能不付出代价直接重用 MC Ø LLVM 代码是 C++, 我们要用 C Ø 代码和 LLVM 的各个层混淆的严重 Ø 需要自己建立细节 Ø 揭露 API 的语义 Ø 不是线程安全的设计 Ø Windows 支持的不好 需要自己来建立所有的绑定 (bindings)( 很多社区在努力 ) 一旦我们利用 LLVM, 要紧跟上游代码 26/46
决定在哪里分离 利用 LLVM, 但是必须移除我们不需要的部分 从哪里分离? Ø 移除的太少会导致大量冗余代码 Ø 移除太多会改变代码结构, 使从上游代码反馈更新变得困难 Capstone 选择的优化设计 Ø 保持各个架构的汇编核心最小程度的改变 Ø 自己重新实现需要的相关层 28/46
实现 1 复制 LLVM 的机器编码层 (MC) 最小程度的改动 MC 的 Disassembler/InstPrinter 层来建立我们的核心 Ø Ø 重写反汇编器的相关层 :MCInst, MCInstrDesc,MCRegisterInfo 重写 InstPrinter 的相关层 :Sstream 用 C 函数指针和结构替换 C++ 的类和方法 用 C 重写 TableGen 29/46
实现 2- LLVM 的 MC 之外 Hook 进 InstPrinter 层得到指令的细节 Ø 指令 ID, 大小, 助记符, 操作数的字符串 Ø 操作数 ( 立即数, 寄存器, 内存 ) Ø 架构相关信息 (Prefix, ModRM, SIB, X86) 从 LLVM 的.TD 文件获取指令的语义信息 Ø 隐藏的寄存器读写 Ø 指令组 分离一些全局变量使 Capstone 线程安全
Capstone 优于 LLVM 的 MC Capstone 是独立的框架, 可以在上面开发独立的工具 提供比汇编代码更多的信息 更紧凑 线程安全的设计 可以嵌入更严格的固件或操作系统环境 防恶意软件 (X86) 对反汇编和逆向工作的进一步优化 更多的硬件模块支持 :Big-Endian for Arm+Arm64 更多细节 www.capstone-engine.org/beyond_llvm.html
Capstone 的容错性 不能只依赖 LLVM 来修复 bug Ø 反汇编不是 LLVM 主要考虑的, 如果不影响代码生成的话 Ø 如果 LLVM 的后端没有生成 bug 那么就不修复 Ø X86 的不好处理的特例是很好的例子 相反,Capstone 更关注于确保合适的处理了所有的特例 32/46
把 Capstone 嵌入固件或操作系统 只建立你真正需要的架构 以 diet 模式建立引擎 以 reduced 模式建立 X86 引擎 到 source/docs/readme 找关于 Windows kernel driver + OSX kext 的例子 33/46
一些不好处理的 X86 指令 34/46
利用 Capstone 开发工具 Capstone 的 API 介绍 C 的示例程序 Python 的示例程序 更多的指导在 source/docs/readme 35/46
Sample code in C 36/46
Sample code in Python Sample Python code to disassemble binary. Sample Python code - output. 37/46
互联网上的应用 Camal: Coseinc automated malware analysis lab. Pyew: Python tool for static malware analysis. Radare2: Unix-like reverse engineering framework and commandline tools. ROPGadget: Gadgets finder and auto-roper. Frida: Inject JavaScript code into native apps on Windows, Mac, Linux and ios. WinAppDbg: Code instrumentation scripts in Python under a Windows environment. MachOView: Visual Mach-O file browser. PowerSploit: PowerShell Post-Exploitation Framework. More at http://capstone-engine.org/showcase.html 38/46
CEbot 39/46
CEnigma 40/46
Epic 41/46
未来的工作 更多的恶意软件防护 : X86. 更多的架构 : Hexagon? M68K? 提供指令更多的语义? 进一步改进性能 ( 已经很快 ) 42/46
Capstone 的未来是有保证的! 故事在延续 : AVX- 512 的扩展在 2013 年计划会于 2015 年支持 ( 英特尔的 Knights Landing 处理器 ) 英特尔已经在关注这个了! 40/46
总结 Capstone 是一个出众的反汇编框架 Ø 多架构 + 多平台 + 多绑定 (bindings) Ø 干净 / 简单 / 轻量级 / 直观的平台无关的 API Ø 提供反汇编指令的细节和语义 Ø 运行期间丰富的选项 Ø 对固件和操作系统内核嵌入的特别支持 Ø 对所有架构的未来升级的保证 Ø 开源的 BSD 许可 我们认真的承诺, 这个项目要做出最好的汇编引擎 相信很快会有更多基于 Capstone 的应用
参考 Website: http://capstone-engine.org Github source: github.com/aquynh/capstone/tree/next (latest) Docs: github.com/aquynh/capstone/blob/next/docs/readme CEbot: http://capstone-engine.org/bot.html CEnigma: http://cenigma.org 44/46
致谢 Capstone 来自于并将继续得到全能的 LLVM 项目的 支持 社区的支持是难以置信的, 谢谢! 特别感谢所有 binding 的作者!! 为所有的代码贡献者, bug 的报告者致敬!!! 45/46
Questions and answers http://www.capstone-engine.org Twitter: @capstone_engine Nguyen Anh Quynh <aquynh -at- gmail.com> 46/46