首页
社区
课程
招聘
[原创]LCTF 2018 easy_heap
发表于: 2018-11-20 03:29 17145

[原创]LCTF 2018 easy_heap

2018-11-20 03:29
17145

这道题目也是一个经典的笔记本类型heap题目,不过题目创新之处在于改写prev_size的方式,我们先来看看大概代码:

有必要指出来的是, malloc_array 存储了各个chunk的地址以及对应存储内容的大小。

read_content函数有一个很明显的 off by one 。当我们创建输入size 248(也就是"0xf8")时, 相邻chunk的prev_inuse会被抹除掉。这样,我们就可以创建overlapping chunk。 再然后,我们用 TCache 双重释放 overlapping chunks,最后控制了新创建的chunk地址就可以任意地址写了。

但是呢,这里所有的chunk大小都为 0x100,也就是说我们必须写入0x100的整倍数以创建overlapping chunk(比如0x200)。 '\x00'会被 read_content检测, 导致我们不能直接输入 0x200prev_size

我想了想,最后发现我们可以用 unsorted bin 改写 prev_size. 当unsorted合并的时候, 他会创建一个prev_size于块的末尾. 如果我们合并chunk A, B, C (大小都是 0x100),会发生如下图的事:

当Unsorted Bin被malloc之后, 它只会改变最后的那个 prev_size (0x300那个), 所以中间的 (0x200) 保持不变。

最后就是常规的TCache利用了。 由于开启了"Full RELRO",我们只能改写 free_hookone_gadget来RCE. btw,我们需要填充7个chunk到TCache,不然程序不会使用unsorted bin。用TCache double free的时候也是一个道理,先free掉unsorted bin里的chunk,我们才能用TCache。

攻击脚本:

最后依然是广告,这是我的blog:http://www.auxy.xyz ,欢迎各位大佬访问QWQ

后面的几个pwn writeup有时间就写orz,尽量争取吧


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2018-11-20 03:35 被Auxy编辑 ,原因:
上传的附件:
收藏
免费 4
支持
分享
最新回复 (8)
雪    币: 235
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
wp清晰,赞

带有pre_size的chunk放入unsorted bin,再拿出来pre_size是会被清空吗?
最后于 2018-11-21 21:21 被Dawnsec编辑 ,原因:
2018-11-20 22:20
0
雪    币: 433
活跃值: (259)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
Dawnsec wp清晰,赞带有pre_size的chunk放入unsorted bin,再拿出来pre_size是会被清空吗?
对的
2018-11-21 23:39
0
雪    币: 3567
活跃值: (467)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
4
我想问问ubuntu16.04怎么把libc2.27加载到程序上去。。网上的改LD_PRELOAD,process里面设置env,试了都没有用。。
2018-11-22 09:30
1
雪    币: 433
活跃值: (259)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
VINKKe 我想问问ubuntu16.04怎么把libc2.27加载到程序上去。。网上的改LD_PRELOAD,process里面设置env,试了都没有用。。[em_2]
我没试过orz 我是直接上18.04的
2018-11-22 13:52
0
雪    币: 3567
活跃值: (467)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
Auxy 我没试过orz 我是直接上18.04的
好 谢谢
2018-11-22 16:33
0
雪    币: 1334
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
# Trigger Overlap
_free(9)
这里貌似跑不通。。在后向合并的时候会校验prev_size和要合并的chunk的chunksize是否一致。问题是这里没有修改这个chunk的chunksize。。我用的2.28版本
2019-8-2 01:15
0
雪    币: 1334
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
V1NKe 我想问问ubuntu16.04怎么把libc2.27加载到程序上去。。网上的改LD_PRELOAD,process里面设置env,试了都没有用。。[em_2]
还需要修改interp的ld.so为对应libc版本的。两种改法,要么改为ld.so,工作目录下有对应版本ld.so,运行时自动使用目录下的ld.so加载;或者直接改为绝对路径(长度够的话)。
2019-8-2 01:26
0
雪    币: 1334
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
AshenOne # Trigger Overlap _free(9) 这里貌似跑不通。。在后向合并的时候会校验prev_size和要合并的chunk的chunksize是否一致。问题是这里没有修改这个chunk的 ...
好吧,看了下2.27版本的。居然没有这个检查,怪不得可以这么玩
2019-8-3 14:17
0
游客
登录 | 注册 方可回帖
返回
//