热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

POPPOPRET是创建SEH漏洞必需的指令序列。要理解PPR是如何工作的,就要先了解各个寄存器的作用:在x86处理器中,EIP(InstructionPointer)是指令寄存器,指向处理

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/

 


推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 技嘉秀高端B450主板:不再支持第七代APU,性价比高且兼容锐龙一代和二代
    在台北电脑展上,技嘉展示了一款高端的B450主板,型号为“b450 aorus pro wi-fi”。该主板具有10+1相供电、散热片覆盖的供电区域和芯片组,以及两个m.2插槽和背部IO挡板。虽然不支持第七代APU bristol ridge,但它兼容锐龙一代和二代,且具有较高的性价比。该主板还配备了音频声卡、Wi-Fi无线网卡等功能,是一款性能出色且设计精良的主板。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
author-avatar
我是王美慧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有