首页 > 编程知识 正文

POP POP RET指令序列在绕过SafeSEH中的必要性

时间:2023-05-04 04:11:14 阅读:245361 作者:3339

这篇文章的目的是解释POP POP RET指令序列的必要性。你经常读到或听到漏洞利用编写者搜索这个指令序列,因为它是它们的漏洞的一个重要部分。但为什么?什么对这个指令序列如此有用,它是如何使用的?这些将是我会尝试回答的问题。
对于以下分析,我将假设在一台32位小端结构的机器上进行。我也会省略很多细节,以便只关注一些概念。还要记住,ESP( Extended Stack Pointer)是扩展堆栈指针,而EIP(Extended Instruction Pointer)是扩展指令指针。POP POP RET是创建SEH(Structured Exception Handler,结构化异常处理程序)漏洞所需的指令序列。弹出值所对应的寄存器对于攻击成功不重要,重要的是ESP向更高地址移动两次,然后执行RET。因此,POP EAX,POP EBX,RET或POP ECX,POP ECX,RET或POP EDX,POP EAX,RET(等等)都可以。每次发生POP <寄存器>时,ESP向较高地址移动一个位置(对于32位架构来说是4字节)。每次发生RET时,地址ESP中的内容被放入EIP中执行(ESP也会移动,但这在这里不重要)。为了创建成功的SEH漏洞,必须找到POP POP RET序列的地址使攻击者两次将ESP移向更高地址,然后在ESP指向的地址处执行指令。对我来说剩下的就是解释为什么我们需要将ESP移向更高地址两次,并从堆栈中的地址开始继续执行。详细解释结构化异常处理的工作原理超出了这篇文章的范围。SEH大部分由链接的记录列表组成,每个记录对应一个异常处理程序。每个记录的第一个字段是指向下一个记录的指针,第二个字段是异常处理程序的地址。SEH漏洞基于这样的事实:攻击者可以改变堆栈的一部分(通过缓冲区溢出),并在那里放置值,从而在异常发生后错误地引导SEH handler的执行。异常发生之后,程序从驻留在堆栈中的第一个SEH handler指向的地址开始执行,攻击者可以找到此地址并更改它。所以攻击者可以通过在堆栈中放置shellcode来改变堆栈,以便改变SEH handler将开始执行的地址,使其指向shellcode。那么,这就结束了吗?攻击者是否成功利用了系统?嗯,可能是这样,但在现实中,SafeSEH会阻止这样的漏洞被成功利用。解释SafeSEH如何保护系统免受这种SEH漏洞超出了这篇文章的范围,但你可以通过互联网搜索找到更多关于SafeSEH的文章。攻击者必须克服SafeSEH,为了这样做,一个可行的方案是利用未启用SafeSEH的模块绕过SafeSEH。这个模块具有以下特征。
1)被加载到内存中。
2)在某处有一个POP POP RET指令序列。
3)没有使用SafeSEH。
如果存在这样的模块,攻击者可以使用缓冲区来溢出指向第一个SEH handler的地址。让我们一步一步看看这样的SEH漏洞是如何工作的。我在下面提供一个例子。地址是完全虚构的。(与实际地址,案例,事实或人的任何相似性纯属巧合)
缓冲区溢出之前,内存看起来像这样。


缓冲区驻留在低于00 00 60 40的地址中。攻击者将溢出缓冲区,以便适当地设置堆栈。 另外,请注意带有POP POP RET指令序列的模块驻留在存储器的另一部分中。缓冲区溢出之后,内存看起来像这样。



攻击者已经把shellcode放置在从00 00 60 48开始的地方,还修改了下一个SEH记录的地址,以包含6字节跳转到shellcode的操作码(EB 06是汇编指令JMP 06的操作码)。 并且,攻击者也改变了SEH Handler的地址以指向POP POP RET指令序列。现在将引发异常,然后内存看起来像这样。


因为系统试图处理引发的异常,它会在堆栈上设置EXCEPTION_DISPOSITION Handler结构体。此结构体的Establisher Frame指针指向第一个handler的记录。第一个handler的记录从00 00 60 40开始,包含下一个SEH记录的地址和SEH handler的地址。系统以这样的方式设置堆栈:ESP指向EXCEPTION_DISPOSITION结构体的开始,这里是00 00 50 00。从该图中,很容易理解攻击者对POP POP RET指令序列的需求。缓冲区溢出后,将引发异常,因此程序从SEH handler的地址开始执行。缓冲区溢出将SEH handler的地址设置为POP POP RET序列的地址,在我们的示例中为10 20 30 40。因此,程序从地址10 20 30 40处开始执行。
第一个POP执行前,ESP指向00 00 50 00。
第一个POP执行后,ESP指向00 00 50 04。
第二个POP执行后,ESP指向00 00 50 08。
RET执行后,EIP指向00 00 60 40,它们是地址00 00 50 08 ESP指向的内容。所以,程序在00 00 60 40继续执行。程序执行指令EB 06,这是到00 00 60 48的6字节跳转,也就是shellcode的开始。很明显,如果攻击者可以用任何希望的值覆盖SEH handler,可以直接用shellcode的地址覆盖它。但是由于SafeSEH保护措施,这是不可能的,所以SEH handler被指向POP POP RET序列。
原文地址:https://dkalemis.wordpress.com/2010/10/27/the-need-for-a-pop-pop-ret-instruction-sequence/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。