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/

为什么POP/POP/RET是必需的相关推荐

  1. 汇编指令push,mov,call,pop,leave,ret建立与释放栈的过程

    栈内的数据 栈在汇编层面是辅助实现函数调用的,每个函数调用过程在栈中被抽象成一帧 ,在老式的32位CPU架构IA32中还有固定寄存器指向当前帧底部(下图中的0x100000f4,0x100000d8) ...

  2. 快速应用计算机制作pop,POP教案创新.doc

    POP教案创新 教 学 笔 记 课程名称: POP广告设计 授课班级: 09(3)广告 授课时间: 2010-2011 学年度 第 二 学期至第 学期 第 一 周至第 十六 周 共 16 周 总学时 ...

  3. python3 : remove,pop和del方法的区别

    这三种方法都是list的删除方法,其中remove是针对可变列表的元素进行搜索删除,而pop和del是针对可变列表的下标进行搜索删除.具体区别如下: 1. remove remove(item)方法是 ...

  4. Facebook POP 使用指南

    Facebook POP 使用指南 Pop是一个动画引擎,用以扩展iOS.OSX的动画类型.相较于iOS.OSX中的基本动画效果,Pop扩展后支持弹簧动画效果与衰减动画效果,你可以用Pop动画引擎来构 ...

  5. python中pop()与pop(0)的时间复杂度区别

    pop操作测试 import timeitdef t6():list_1 = list(range(100))for i in range(100):list_1.pop() # pop最后一个元素d ...

  6. [转载] 在python中pop的用法_python中pop()函数如何使用

    参考链接: Python list pop() pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. 语法:list.pop(obj=list[-1]) //默认为 in ...

  7. JS封装数组API push,pop,shift,unshift,sort, reverse

    push(),pop(),shift(),unshift(),sort(),reverse() 1.入栈push() push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度push() 内 ...

  8. python实现栈的操作_python简单实现队列和栈push、pop操作

    栈: # -*- coding: utf-8 -*- #定义序列 lst=[] def pop(): if(len(lst)==0): print"栈为空","无法出栈& ...

  9. Array.prototype.pop()

    Array.prototype.pop() pop() 方法从数组中删除最后一个元素并返回该元素.此方法更改数组的长度. const plants = ['broccoli', 'cauliflowe ...

最新文章

  1. 已经导入jar包mysql还是报错_java通过JDBC连接数据库,老是报错:ClassNotFoundException.该导入的jar包我也已经导入了。...
  2. 重要性采样原理及实现
  3. Android Studio xml文件中的布局预览视图
  4. 蓝桥杯历届试题----斐波那契(矩阵快速幂)
  5. linux chromebook arm,第一款可拆卸 ARM Chromebook 可能是 KODAMA
  6. java集群插件_别说,Cerebro还真好用!老板再也不用担心ES集群了
  7. JavaScript 多线程概念的含义
  8. Find password cracker in 11g
  9. python狗屁不通文章生成器_狗屁不通文章生成器,GitHub火爆的万字啰嗦文章瞬间生成...
  10. 深度学习中的Precision和Recall,AP,mAP
  11. Clearcase, SVN, Git之我见
  12. 参加天池大数据竞赛是怎样一种体验?
  13. 入门互联网IT行业就业前景如何?
  14. 每日一佳——A Support Vector Method for Multivariate Performance Measures(Thorsten Joachims,ICML,2005)
  15. CPU乱序执行基础 —— Tomasulo算法及执行过程
  16. resnet50结构图
  17. DataPipeline亮相“2021科技助力湾区数字金融发展峰会”,解锁“实时数据管理”密码
  18. [实用技巧] 永久改键软件SharpKeys, 超级好用
  19. 多线程异步日志系统,高效、强悍的实现方式-双缓冲
  20. a 标签链接 设置点击下载文件

热门文章

  1. Ubuntu卸载软件(终端)方法
  2. 区块链金融理论测试题-----「大数据、区块链时代」
  3. 限50台|英码边缘计算盒子免费试用,数量有限,先到先得
  4. vmesxi 虚拟服务器 黑苹果,ESXI虚拟机安装MacOS
  5. 2个月一把通过初级会计经验分享!
  6. DASOU知识星球学的知识图谱
  7. Android应用冻结流程分析,Android cameraSource.stop()导致应用程序冻结
  8. “一年之计在于春”---博客之开场篇
  9. 火车票被秒光,别慌:一款 Python 自动抢票神器,收藏起来回家不愁
  10. 苏嵌实训——day19