【CTF】初学ROP

2023-11-17

在CTF PWN的题型中有一种利用方式是ROP,原理学明白了,但是实操起来一直不太理解ROP链的具体构造,为了弄明白原理,就找了一道入门题目,对照着wp进行单步调试,来理解ROP链的构造。

题目:buuctf,PicoCTF_2018_rop_chain

拿到题目,对主函数进行分析,局部变量s开辟了18h大小空间,但是gets函数在接收数据的时候没有限制长度,会导致栈溢出。

需要控制函数返回地址跳转到后门函数获取flag,但是有前提条件,win1和win2全局变量不能为0,而且a1参数要等于0DEADBAADh,a1参数可以通过栈溢出控制栈中参数的值,win1和win2则需要调用另外两个内置函数来进行赋值,这时就需要构造ROP链,1调用win_function1修改win1的值,2调用win_function2修改win2的值,3调用后门函数。

win_fucntion1函数直接可以为win1赋值。

win_function2函数想要为win2赋值,还需要将参数设置为0xBAAAAAAD。

这里直接把wp的payload抄来,单步调试来理解ROP的原理。

payload = fill + win_fucntion1 + win_function2 + win2_arg + pop_ebp_ret + flag_function + flag_arg + pop_ebp_ret

exp如下:

from pwn import *
#p = process("./PicoCTF_2018_rop_chain")
p = remote("node4.buuoj.cn","26202")
pop_ebp_ret = 0x080485d6
payload = b"a"*24 + b"a"*4 + p32(0x080485CB) + p32(0x080485D8) + p32(pop_ebp_ret) + p32(0x0BAAAAAAD) + p32(0x0804862B) + p32(pop_ebp_ret) + p32(0x0DEADBAAD)
p.sendafter("Enter your input> ",payload)
p.interactive()
 

重点看一下payload在内存中的变化,一开始不理解为什么要加pop_ebp_ret,通过内存调试来解决自己的困惑。

gdb是linux上老牌调试工具,大部分逆向工作者的首选调试器,我个人更喜欢edb,是个图形化的调试工具,界面布局和操作和windows上的ollydbg很像,操作起来更加直观,对于我这种老ollydbg用户来说是非常友好的。

来到08048731地址处,设置断点,然后在内存堆栈中手动修改为payload。

 单步调试,观察内存中栈的变化,运行到ret指令,观察到ebp被pop成为了我们填充的aaaa,此时栈顶指针为我们覆盖的返回地址,此地址为win_function1的地址,该函数不需要参数。 
  

执行ret后,函数就跳转到了win_function1中,ret会让栈发生变化,esp+4,这时栈顶位置就是win_function1执行完成后要跳转的返回地址,也就是下一个函数win2_function2函数的地址。

执行完win_fucntion1函数后,就会跳转到win_function2,根据payload分析,此时esp栈顶位置是ret的返回地址,这里返回到pop_ebp_ret的地方,esp+4的位置是win_function2的参数,esp+8位置是下一个要跳转到的函数位置vuln函数。

 pop_ebp_ret的地址是通过ROPGadget获取到的pop ebp; ret汇编代码地址。

win_function2为什么要返回到pop_ebp_ret,这里困扰我一直不能理解,单步跟踪后发现,原因是此函数有参数,当前函数执行ret后,此时栈顶是win_function2的参数,需要执行pop ebp将栈顶弹出,让栈顶指针指向vuln函数的地址,在利用ret跳转到到vuln函数,这就是pop ebp​;ret的作用​。如果是传两个参数,那就需要pop两次再ret,需要注意的是pop会改变寄存器的值,执行完pop操作后​是否会影响到函数的正常运行。 

vuln函数同上,需要传递参数,此时栈结构应为pop_ebp_ret + arg1。

至此成功pwn​。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【CTF】初学ROP 的相关文章

随机推荐

  • 08黑马笔记之栈的应用_就近匹配(括号)

    08黑马笔记之栈的应用 就近匹配 括号 思想 前提 使用栈的链式存储来实现 1 遇到左括号就放进栈中 再遇到右括号就将左括号从栈中删除 若栈中没有元素或者不是左括号 则说明右括号匹配失败 以上是判断右括号不匹配的 下面是判断左括号不匹配 2
  • pandas中DataFrame的修改元素值、缺失值处理、合并操作的方法

    实验目的 熟练掌握pandas中DataFrame的修改元素值 缺失值处理 合并操作的方法 实验原理 concat合并 pd concat objs axis 0 join outer join axes None ignore index
  • Qt Quick - Dial

    Qt Quick Dial使用总结 一 概述 二 使用 一 概述 Dial 表盘类似于音响或工业设备上的传统表盘旋钮 它允许用户在一个范围内指定一个值 像CircularGauge一样 Dial可以显示刻度来指示当前值 当一个合适的步长与t
  • centos7安装apt

    centos7安装apt 搜索并下载对应版本 rpmforge release 下载地址 https www rpmfind net linux rpm2html search php query rpmforge release 执行安装
  • 大型网站在架构上应当考虑哪些问题

    大型网站在架构上应当考虑哪些问题 分层 分层是处理任何复杂系统最常见的手段之一 将系统横向切分成若干个层面 每个层面只承担单一的职责 然后通过下层为上层提供的基础设施和服务以及上层对下层的调用来形成一个完整的复杂的系统 大型网站的软件系统也
  • 【Docker】Consul构建集群服务

    1 构建Docker Cousul集群服务 1 在 后输入mkdir consul命令 然后按Enter键 创建目录Consul 示例代码如下 mkdir consul ll 效果如图1所示 2 进入consul目录 在 后面输入cd co
  • 【WIN】【C++】遍历文件夹下所有文件

    遍历某一路径下的所有文件 主要用到的两个api是 findfirst和 findnext 接口已经封装好了 直接复制getAllFiles拿去用即可 封装接口 void getAllFiles string path vector
  • 测试人员代码走查基础要点

    代码走查 是测试人员了解代码逻辑 进行测试设计的重要环节 并且有很多bug并非需要到运行程序进行测试才能发现 通过合理的代码走查方法能提前发现相当多的BUG 除常见的业务逻辑与程序逻辑不符外 本文收集了在过往工作中的经常能发现BUG的走查要
  • Cookie:使用Cookie实现记住用户的账号和密码

    目录 练习一 java web jsp 中使用cookie记住用户的账号和密码 练习二 java web jsp servert 中使用cookie记住用户的账号和密码 进阶例题 java web中使用cookie记住用户的账号和密码 练习
  • JAVA之初识springMVC框架

    1 环境 操作系统 Mac OS 10 12 6 Tomcat v7 0 JDK 1 7 工具 eclipse 2 新建项目 用eclipse新建项目 选择Dynamic Web Project 将项目字符集改为UTF 8 3 编辑web
  • SpringBoot--基础--07--多线程

    SpringBoot 基础 07 多线程 一 方式1 1 1 代码和测试 TaskConfig package fei zhou springboot4 demo2 import java util concurrent Executor
  • PAT乙级(Bascic Level)1037(C++)

    1037 在霍格沃茨找零钱 20 如果你是哈利 波特迷 你会知道魔法世界有它自己的货币系统 就如海格告诉哈利的 十七个银西可 Sickle 兑一个加隆 Galleon 二十九个纳特 Knut 兑一个西可 很容易 现在 给定哈利应付的价钱P和
  • 【ES6】Set 和 Map 数据结构

    文章目录 前言 一 Set 1 用法详解 1 1 声明方式 1 2 遍历的四种方式 2 应用场景 2 1 数组去重 2 2 合并去重 2 3交集 2 4 差集 3 WeakSet 二 Map 1 用法详解 1 1 声明方式 1 2 遍历的四
  • 论文阅读 Semantic Graph Convolutional Networks for 3D Human Pose Regression

    Semantic Graph Convolutional Networks for 3D Human Pose Regression 使用语义图卷积网络对三维人体姿态进行回归 Abstract 在这篇论文中 我们研究了学习Graph Con
  • (查看,和保存)windows下通过cmd命令符窗口查看、保存文件目录结构

    背景 有时候我们查看目录结构 或者保存目录结构信息 来对项目进行说明 一 查看文件结构 1 tree 查看tree命令操作 2 tree 只展示文件夹 tree 3 tree F 文件夹文件都展示 tree F 二 保存文件结构 在上述使用
  • PHP第三课:流程判断(下)

    上期PHP 我们学会了if判断 今天我们来学switch 看下这串代码
  • java算法题两个数组合并_算法:两个有序数组合并成一个有序数组 java语言

    题目 有两个有序数组a 和b 将它们合并成数组c 需要c 也是有序数组 思路 新建一个以两个集合长度之和为长度的新数组 从两数组最左边开始比起 把小的放入新集合 并用变量标记后一位置 每次比较都是比较的最左边未比较过的元素 通过变量 循环比
  • 用python计算灰度图像中掩模的面积(以像素为单位)

    下面是一个使用OpenCV的方法 我们用Otsu的阈值来获得一个二值图像 这个图像的前景对象是白色的 背景是黑色的 从这里我们使用cv2 countNonZero 它返回掩码上的白色像素数 找到白色像素的数量 pixels cv2 coun
  • Linux中的O_RDONLY、O_WRONLY、O_RDWR、O_APPEND、O_TRUNC、O_EXCL、O_EXCL、O_SYNC、O_NONBLOCK

    2023年7月11日 周二下午 这几个常量被定义在头文件fcntl h中 fcntl 是 file control 的缩写 它是由 file 文件 和 control 控制 两个单词组合而成的 在介绍这几个常量之前 要先介绍一下open函数
  • 【CTF】初学ROP

    在CTF PWN的题型中有一种利用方式是ROP 原理学明白了 但是实操起来一直不太理解ROP链的具体构造 为了弄明白原理 就找了一道入门题目 对照着wp进行单步调试 来理解ROP链的构造 题目 buuctf PicoCTF 2018 rop