[原创]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
检测, 导致我们不能直接输入 0x200
到 prev_size
。
我想了想,最后发现我们可以用 unsorted bin 改写 prev_size
. 当unsorted合并的时候, 他会创建一个prev_size
于块的末尾. 如果我们合并chunk A, B, C (大小都是 0x100),会发生如下图的事:
当Unsorted Bin被malloc之后, 它只会改变最后的那个 prev_size (0x300那个), 所以中间的 (0x200) 保持不变。
最后就是常规的TCache利用了。 由于开启了"Full RELRO",我们只能改写 free_hook
成one_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编辑
,原因:
上传的附件: