技术社区
安全培训
技术社群
积分商城
先知平台
漏洞库
历史记录
清空历史记录
相关的动态
相关的文章
相关的用户
相关的圈子
相关的话题
注册
登录
关于LACTF 2025 mmapro知识点思考
Feng_ZZ
CTF
81浏览 · 2025-03-07 08:20
返回文档
前言
这个题的源代码十分的简短,但是需要对
mmap
的实现有一定的了解,通过这个复现随便来浅浅了解一下
mmap
函数
题目源码
程序一开始就给了我们
mmap
的地址,泄露了
libc
地址给我们
其次给我们可以控制
mmap
的六个参数
猜测
既然程序给了我们
libc
的地址,也给了我们控制
mmap
的参数,那么大概率是需要通过
mmap
来实现控制程序的执行流程
mmap
函数
Linux的
mmap
(内存映射)是一种将文件或设备直接映射到进程虚拟地址空间的机制,允许进程像访问内存一样操作文件或共享内存,函数原型
前面的三个参数都是老朋友,最主要的是后面的
flags
,通过查阅文档可以发现对
flags
的描述
flags宏
十六进制值
说明
MAP_SHARED
0x01
映射区域与其他进程共享,对内存的修改会同步到文件。
MAP_PRIVATE
0x02
映射区域为私有,写入时会触发“写时复制”(Copy-on-Write),不修改文件。
MAP_FIXED
0x10
强制使用指定的起始地址
start
,若冲突则失败。
MAP_ANONYMOUS
0x20
匿名映射(不关联文件),通常与
MAP_ANON
等价。
MAP_DENYWRITE
0x0800
禁止对映射文件的其他直接写入操作(需文件未被其他进程打开写入)。
MAP_LOCKED
0x2000
锁定映射区域,防止被交换到磁盘(Swap)。
可以看到我们通过
MAP_ANONYMOUS
实现匿名映射,不与任何文件做关联,即可以不用管
fd
的值;而
MAP_FIXED
可以强制指定一个地址,作为开始,那么我们是否可以利用这个特性将
libc
的地址重新映射,所以我们先实践一下,是否可行
MAP_ANONYMOUS
与
MAP_FIXED
或值刚好是
0x30
但是经过实践发现不太行
于是问了一下
deepseek
,发现还需要加这个
flags
,**
MAP_PRIVATE
**:通过写时复制实现内存修改的隔离,保护原始数据不被意外修改。
因为本质上我们
libc
也算是映射的一个文件的副本,若我们想要覆盖(通过
mmap
)它的话,必须是加上
MAP_PRIVATE
,才可以
所以我们第二次尝试,这次加上
MAP_PRIVATE
的
flags
成功实现,但是我们发现这里
libc
的数据因为重新覆盖而变成了空数据,即是全部都是
00
字符
思路&利用方法
对于目前来说,我们可以实现的是将一段
libc
的内存,使之变为全是00的字符数据,那么我们使用在
mmap
函数所在的页看看会发生什么
我们继续步进看看会发生什么
这里可以发现
mmap
函数的数据全部是00字符,而这些00字符刚好组合成这个汇编代码
而
mmap
的返回值刚好是我们一开始给它的
start
的地址,所以这里是一个合法地址,使得这个指令可以正常执行下去,形成了一个类似于
Nop
的滑板指令
我们继续执行就可以看到它会卡到我们没有修改的相邻页上的代码地址
自此,如果在以页为开始的
libc
代码,即以
0x000
结尾的地址,并且是在
mmap
函数所在的页的下方,我们就可以使用它作为我们可用的
gadget
下面是参考了官方
wp
可用
gadget
官方
exp
使用的是这个地址
我们可以计算一下也就是
0x115000+0x57000
就是
0x16c000
的位置,这里可以看看是怎么实现的,下面是以
mmap
所在的页为
start
地址
可以发现是
ptsname_r
函数的开头位置,并且
call ioctl
并没有被我们所覆写,所以可以成功调用,也有把
canary
给压入栈中,最后
这里可以发现卡在了0x32的位置上,如果我们仔细看的话就可以发现,这个0x32就是我们控制的
flags
数据,那么我们改如何利用这个呢
我们回想一下我们正常使用
mmap
的时候,我们是怎么用这个
flags
,例如
不难发现是或运算,并且对应的
flags
也就是只用那么几个,那么我们可以找到一个符合条件的
ret
,即满足上面的
flags
的条件的,我们可以通过对应寻找一下
随便选条032为结尾即可
然后既然我们的
rdi
是我们的
start
地址,那么我们可以使用
gets
写入
shellcode
,然后再让程序跳转到位置即可
原理就是把flags设置为符合条件并且是ret指令的地址,然后把
fd
控制位
gets
函数,
offset
控制为
start
地址,这样就可以实现一个
ROP
链
最后
exp
完整
exp
如下
最后
因为是按页覆盖,实际上利用的
gadget
并不是很多,笔者也是有尝试过通过爆破来实现定位到可用
gadget
的偏移,不需要很久的时间,可以利用
pwntools+gdb
来对最后卡住的寄存器进行判断,来实现可用
gadget
的爆破
附件:
einstein.zip
下载
0
人收藏
0
人喜欢
转载
分享
0
条评论
某人
表情
可输入
255
字
评论
发布投稿
热门文章
1
2025ISCC练武区域赛和决赛pwn以及擂台pwn合集
2
通过Elastic EDR看smbexec并进行二次开发Bypass
3
php代码审计篇 - 信呼OA 前台注入分析一
4
D3CTF-d3kshrm(预期&非预期)题解
5
Tomcat解析XML引入的新颖webshell构造方式
近期热点
一周
月份
季度
1
2025ISCC练武区域赛和决赛pwn以及擂台pwn合集
2
通过Elastic EDR看smbexec并进行二次开发Bypass
3
php代码审计篇 - 信呼OA 前台注入分析一
4
D3CTF-d3kshrm(预期&非预期)题解
5
Tomcat解析XML引入的新颖webshell构造方式
暂无相关信息
暂无相关信息
优秀作者
1
一天
贡献值:18800
2
T0daySeeker
贡献值:18700
3
1174735059082055
贡献值:15000
4
Yale
贡献值:14000
5
1674701160110592
贡献值:13000
6
LeeH
贡献值:10000
7
MeteorKai
贡献值:9000
8
姓*户
贡献值:8600
9
熊猫正正
贡献值:8000
10
lufei
贡献值:8000
目录
前言
题目源码
猜测
mmap函数
思路&利用方法
可用gadget
exp
最后
转载
标题
作者:
你好
http://www.a.com/asdsabdas
文章
转载
自
复制到剪贴板