(State of) The Art of War: Offensive Techniques in Binary Analysis (2016)
30 Jun 2016 | categories notes原文:(State of) The Art of War: Offensive Techniques in Binary Analysis
为什么要做
现有的二进制分析方法并不实用:
- 很多工作止于原型,后人难以复用,需要重复劳动
- 不同技术难以相互比较:目标系统不一样、对环境的假设不一样、测试不一样……
做了什么
- 设计了一个二进制程序分析框架angr,在这个框架下(重新)实现了众多现有的二进制分析技术
- 跨架构:libVEX/PyVEX
- 跨平台(POSIX接口):CLE(CLE Load Everything)
- 支持多种分析,提供相应内存模型和数据域的抽象(路径管理PathGroup,分析管理Analysis,程序状态表示SimuVEX,数据模型Claripy)
- 易于安装使用:可用Python包管理工具pip安装
- 分析了对大规模程序综合运用这些技术时遇到的困难和可能的解决方案
- 将angr开源
怎么做到的
angr实现了一系列当下流行的程序分析技术,对其中一些作了改进,其它则根据文献做的重新实现。具体有:
- 静态分析(作了改进)
- Graph-based:CFG的恢复
- Data-based:Value-Set analysis
- 动态分析(重新实现)
- 具体执行(Fuzzing):Coverage-based vs. Taint-based
- 符号执行:Classical vs. Symbolic-based fuzzing vs. Under-constrained
- 漏洞利用(重新实现)
- 重现crash
- 利用生成
- 利用强化:绕过ASLR等安全机制
CFG的恢复技术
CFG恢复中最主要的问题是对间接跳转(indirect jump)和死代码的处理,对于前者,angr设计了CFGAccurate
,综合利用forced execution(快速识别cfg)、backward slicing(提供上下文敏感分析)、symbolic execution(处理间接跳转)等技术,并维护间接跳转列表,循环执行CFGAccurate
,直至列表为空。这个模块运行比较慢,而且不能自动处理死代码。
对于后者则设计了CFGFast
,它只识别函数的位置、内容,以及直接调用。采用了ByteWeight的函数识别技术。它的速度快、高覆盖率,但缺少函数间的可达性信息。
Value-set分析
现有的Value-set分析对真实二进制程序并不好用,进行了一系列的改进以增加分析精度。如
- 用strided interval集合代替单一的strided interval,以减少分析对象为跳转目标时采用单一strided interval造成的跳转对象和非跳转对象的混淆
- 用轻量级的代数求解器(algebraic solver )求解路径约束上的值域,降低分析复杂度
- 用LLVM中使用的符号位不可知的(signedness-agnostic)域处理,克服原有分析认为所有值都是有符号的假设,是的可以同时处理有符号的域和无符号的域。
符号执行
基本套用Mayhem和Veritesting的思路,重新实现Under-constrained符号执行时做了如下改进:
- 考虑全局数据
- 限制函数内的最大分支数
利用技术
crash重现是重新实现了Replayer的工作;利用生成是采用了AEG和Mayhem的思路;利用加强则基于Q的思路重新实现了ROP编译器并作了细节上的改进(栈指针的指向分类,ROP片段的分类)
效果如何
使用DARPA的Cyber Grand Challenge竞赛的测试用例作为测试对象,测试集有131个应用。CGC还提供了专门的二进制格式,测试环境等,和实际环境不通用——测试用的OS只有7个系统调用,因此很容易模拟。(实际OS的系统调用通常有上百到上千,完整的分析工具需要模拟所有这些系统调用。)
CFG恢复技术和IDA Pro作了对比,结果显示CFGFast
能更快更多地识别代码,但若想获得完整的程序CFG调用信息,必须综合使用CFGFast
和CFGAccurate
。
符号执行对比实验表明,Veritesting可以减少路径爆炸的概率,但合并后的路径约束过于复杂,导致SMT难以解出,反而报告的漏洞数变少;Symbolic-assisted fuzzing的结果比传统符号执行更好,但主要功劳是fuzzing的;Under-constrained符号执行的误报率比静态分析还高,而现有的误报过滤技术还有提高空间
漏洞利用技术的实验表明除了crash重放,现有利用技术对实际代码基本用不了,都还有提升空间。而crash重放碰到外部随机输入可以影响程序控制流的情况时也没有办法重现crash。
然后呢
没了。