# 深入探讨ROP 载荷分析
0x00 简介
=======
* * *
Exploit-db上看到的感觉还不错,所以就翻译一下,原文题目为《Deep Dive into ROP Payload Analysis》,作者Sudeep Singh。
这篇文章的主要目的是介绍漏洞利用中的ROP载荷的分析技术,同时也深入分析一种ROP缓解技术stack pivot检测技术,该技术目前被用于防护软件中。
通过分析之前发现的两个攻击样本(CVE-2010-2883 和CVE-2014-0569),对比了两个ROP载荷的复杂性和绕过stack pivot检测技术的能力对ROP载荷的详细分析将有助于我们更好的了解漏洞利用技术,开发出更有效的检测机制。
这篇文章主要针对漏洞分析人员以及对面向返回的编程(Return Oriented Programming)感兴趣的人。
0x01 场景
=======
* * *
漏洞利用正变成越来越流行的领域,同时在类似浏览器、Adobe Reader、Flash Player、Microsoft Silverlight 、Java等通用软件中也经常发现漏洞。由于漏洞利用通常是攻击中的第一个阶段,因此比较适宜在漏洞利用阶段对攻击做防护。
在互联网上可以找到有很多用于检测和阻止漏洞利用的方案和技术。这些检测机制通常聚焦于大多数漏洞的共同特点。例如:
1. ROP:由于现在的操作系统都默认开启了DEP,因此漏洞利用需要绕过DEP保护。ROP是绕过DEP最常用的技术。然而,由于ROP的工作方式,因此可以有很多的特征可以检测它。我们将下文中深入分析其中的stack pivot检测技术。
2. Heap Spray:为了获取稳定的利用,大多数漏洞利用将载荷喷射到进程的地址空间中。当漏洞被触发时,执行流被重定向到喷射在进程堆中的载荷导致漏洞被利用。然而,由于Heap Spray技术的广泛应用,也再一次提供用于检测它们的特征。
最常见的特征是用Heap Spray的模式,0x0c0c0c0c是最为大家所熟知的。当然也有一些其他的模式也能够用于Heap Spray。
0x02 利用缓解
=========
* * *
这篇文章中,我们主要关注ROP载荷分析,因此将主要讨论stack pivot检测技术。
据对多数漏洞利用主要分为下面几个阶段:
1. 攻击者将载荷(Nopsled + ROP payload + shellcode)喷射到堆上
2. 触发软件的漏洞
3. 通过漏洞,攻击者控制了一些寄存器
4. 这些寄存器被设置指向stack pivot gadget
5. stack pivot gadget将切换原始程序的堆栈为指向攻击者控制的堆中的数据,而新的堆栈中则包含我们的ROP载荷。
6. stack pivot gadget中的返回指令将开启ROP链的执行。
作为例子,通过一个UAF(Use After Free)漏洞的结果,我们将得到如下的场景:
“`
movedx, dwordptr ds:[ecx] ; edx为包含漏洞的C++对象的虚表指针
pushecx
call dwordptr ds:[edx+0x10] ; 调用攻击者控制的虚表中的虚函数
“`
因为我们控制了上述的程序执行流,所以我们能够将控制流重定向到下面的stack pivot gadget:
xchgeax, esp retn
当漏洞被触发时,如果eax正指向攻击者控制的堆中的数据,通过上面的代码片段,eax指向的堆空间将变成新的栈。
ROP是非常好的技术,被广泛的用在现在漏洞攻击中。这也导致了很多针对这种利用技术的检测机制被设计出来。
其中一种技术就是stack pivot检测技术。
当ROP链执行时,攻击者的最终目标是将shellcode重新放置在可执行的内存区域以绕过DEP保护。为了做到这一点,攻击者将调用一些类似VirtualAlloc的API函数。这些被攻击者用于绕过DEP的API是有限的。
由于原始程序的堆栈被切换为指向攻击者控制的数据,因此栈指针不再指向栈限以内。
程序栈限的信息被存储在TEB中。
“`
1:020> !teb
TEB at 7ffda000
ExceptionList: 0220f908
StackBase: 02210000
StackLimit: 02201000
“`
如果栈指针不满足下面的条件,我们认为这是一个stack pivot:
if(esp>StackLimit&&esp

