糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 为什么POP/POP/RET是必需的

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

时间:2023-10-14 17:29:40

相关推荐

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

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是必需的》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。