POP/POP/RET是创建SEH漏洞必需的指令序列。
要理解P/P/R是如何工作的,就要先了解各个寄存器的作用:
在x86处理器中,EIP(InstructionPointer)是指令寄存器,指向处理器下条等待执行的指令地址(代码段内的偏移量),每次执行完相应汇编指令EIP值就会增加。ESP(StackPointer)是堆栈指针寄存器,存放执行函数对应栈帧的栈顶地址(也是系统栈的顶部),且始终指向栈顶;EBP(BasePointer)是栈帧基址指针寄存器,存放执行函数对应栈帧的栈底地址,用于C运行库访问栈中的局部变量和参数。
注意,EIP是个特殊寄存器,不能像访问通用寄存器那样访问它,即找不到可用来寻址EIP并对其进行读写的操作码(OpCode)。EIP可被jmp、call和ret等指令隐含地改变(事实上它一直都在改变)。
不同架构的CPU,寄存器名称被添加不同前缀以指示寄存器的大小。例如x86架构用字母“e(extended)”作名称前缀,指示寄存器大小为32位;x86_64架构用字母“r”作名称前缀,指示各寄存器大小为64位。
OK,letusbegin.
在这个P/P/R指令中,pop哪个寄存器都不重要,重要的是ESP两次向更高地址移动然后再执行RET。所以,不管是POPEAX,POPEBX,RET还是POPECX,POPECX,RET还是POPEDX,POPEAX,RET都是可以的。
每发生一次POP<寄存器>,ESP都向更高地址移动一个position(在32位机中,1position=4bytes)。每发生一次RET,ESP指向的内容就会放入EIP中并执行。
为了成功的创建SEH漏洞,P/P/R指令序列的地址必须要知道。不然怎么让esp向高位移动两次后执行esp内容指向的code捏。
还有这个SEH,是怎么工作的呢?SEH由记录链表组成,每一条记录对应一个exceptionhandler。每条记录的第一块区域指向下一条记录,第二块区域是exceptionhandler的地址。
SEH漏洞利用是因为attackers能够修改部分的栈,放进去的值能够在发生exception后,错误引导SEHhandler执行。在发生意外时,执行由firstSEHhandler指向的地址上的code。Attackers能够找到这个地址并且改变它。比如指向由attacker放入的shellcode。
Attackers会寻找具有如下特点的模块用来缓冲区溢出来指向firstSEHhandler的地址:
1.加载在内存中。
2.在某处有POP/POP/RET指令序列。
3.没有SafeSEHsafeguards。
接下来看看SEH漏洞怎么工作的。
在缓冲区溢出前,内存长这样:
Attacker将会溢出一个缓冲区,这个缓冲区的位置在00006040下面。注意有P/P/R指令的模块在内存的另一块区域。
在缓冲区溢出后,内存长这样:
Attacker的shellcode起始位置为00006048。同时也修改了下一条SEH记录的位置,包含了6bytejump的操作码(EB06是汇编指令“JMP06”的操作码)。同时也修改了SEHhandler的地址,使之指向POP/POP/RET指令序列。
当异常发生后,内存长这样:
因为系统尝试处理发生的异常,在栈中开始EXCEPTION_DISPOSITIONHandler结构,这个结构的EstablisherFrame指向firsthandlerrecord。这个firsthandlerrecord从00006040开始,包含下一条SEH记录的地址和SEHhandler的地址。这个ESP指向EXCEPTION_DISPOSITIONHandler结构开始的地方,这里是00005000。
所以说P/P/R指令序列是必须的。把ESP向高地址移动2position(因为2次POP),再接下来执行ESP里的内容,即对应地址那里的code。
总的流程如下:
在缓冲区溢出后,触发异常,从SEHHandler的地址开始执行(该地址属于firsthandlerrecord,由establisherframe指向)。缓冲区溢出后,把SEHhandler的地址改为了POPPOPRET序列的地址。(这里的例子就是10203040)
所以从10203040开始执行
在第一个POP执行时,ESP指向00005000
在第一个POP执行后,ESP指向00005004
在第二个POP执行后,ESP指向00005008
在RET执行后,EIP指向00006040,这是ESP指向00005008的内容
所以执行会从00006040继续开始
接下来EB06指令会被执行,跳6byte到00006048,即shellcode开始的地方。到此漏洞利用成功。
英语捉急(╯‵□′)╯︵┻━┻
原文地址:
//10/27/the-need-for-a-pop-pop-ret-instruction-sequence/
如果觉得《为什么POP/POP/RET是必需的》对你有帮助,请点赞、收藏,并留下你的观点哦!