为什么POP/POP/RET是必需的

POP/POP/RET是创建SEH漏洞必需的指令序列。

要理解P/P/R是如何工作的,就要先了解各个寄存器的作用:

在x86处理器中,EIP(Instruction Pointer)是指令寄存器,指向处理器下条等待执行的指令地址(代码段内的偏移量),每次执行完相应汇编指令EIP值就会增加。ESP(Stack Pointer)是堆栈指针寄存器,存放执行函数对应栈帧的栈顶地址(也是系统栈的顶部),且始终指向栈顶;EBP(Base Pointer)是栈帧基址指针寄存器,存放执行函数对应栈帧的栈底地址,用于C运行库访问栈中的局部变量和参数。

注意,EIP是个特殊寄存器,不能像访问通用寄存器那样访问它,即找不到可用来寻址EIP并对其进行读写的操作码(OpCode)。EIP可被jmp、call和ret等指令隐含地改变(事实上它一直都在改变)。

不同架构的CPU,寄存器名称被添加不同前缀以指示寄存器的大小。例如x86架构用字母“e(extended)”作名称前缀,指示寄存器大小为32位;x86_64架构用字母“r”作名称前缀,指示各寄存器大小为64位。


OK,let us begin.

在这个P/P/R指令中,pop哪个寄存器都不重要,重要的是ESP两次向更高地址移动然后再执行RET。所以,不管是POP EAX,POP EBX,RET还是POP ECX,POP ECX,RET 还是POP EDX,POP EAX,RET都是可以的。

每发生一次 POP <寄存器>,ESP都向更高地址移动一个position(在32 位机中,1 position = 4 bytes)。每发生一次RET,ESP指向的内容就会放入EIP中并执行。

为了成功的创建SEH漏洞,P/P/R指令序列的地址必须要知道。不然怎么让esp向高位移动两次后执行esp内容指向的code捏。

还有这个SEH,是怎么工作的呢?SEH由记录链表组成,每一条记录对应一个exception handler。每条记录的第一块区域指向下一条记录,第二块区域是exception handler的地址。

SEH漏洞利用是因为attackers能够修改部分的栈,放进去的值能够在发生exception后,错误引导SEH handler执行。在发生意外时,执行由first SEH handler指向的地址上的code。Attackers能够找到这个地址并且改变它。比如指向由attacker放入的shellcode。

Attackers会寻找具有如下特点的模块用来缓冲区溢出来指向first SEH handler的地址:

1.加载在内存中。

2.在某处有POP/POP/RET指令序列。

3.没有SafeSEH safeguards。

 

接下来看看SEH 漏洞怎么工作的。

在缓冲区溢出前,内存长这样:

 

Attacker将会溢出一个缓冲区,这个缓冲区的位置在00 00 60 40下面。注意有P/P/R指令的模块在内存的另一块区域。

 

在缓冲区溢出后,内存长这样

 

Attacker的shellcode起始位置为00 00 60 48。同时也修改了下一条SEH记录的位置,包含了6byte jump的操作码(EB 06是汇编指令“JMP 06”的操作码)。同时也修改了SEH handler的地址,使之指向POP/POP/RET指令序列。

 

当异常发生后,内存长这样

 

因为系统尝试处理发生的异常,在栈中开始EXCEPTION_DISPOSITION Handler结构,这个结构的Establisher Frame指向first handler record。这个first handler record从00 00 60 40开始,包含下一条SEH记录的地址和SEH handler的地址。这个ESP指向EXCEPTION_DISPOSITION Handler结构开始的地方,这里是00 00 50 00。

所以说P/P/R指令序列是必须的。把ESP向高地址移动2 position(因为2次POP),再接下来执行ESP里的内容,即对应地址那里的code。

 

总的流程如下:

在缓冲区溢出后,触发异常,从SEH Handler的地址开始执行(该地址属于first handler record,由establisher frame指向)。缓冲区溢出后,把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,这是ESP指向00 00 50 08的内容

所以执行会从00 00 60 40继续开始

接下来EB 06指令会被执行,跳6 byte到00 00 60 48,即shellcode开始的地方。到此漏洞利用成功。

 

英语捉急(╯‵□′)╯︵┻━┻

原文地址:

https://dkalemis.wordpress.com/2010/10/27/the-need-for-a-pop-pop-ret-instruction-sequence/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值