一、原理:
先来看下small bin中的源码:
1 | if (in_smallbin_range(nb)) { |
这个攻击方式是针对small bin的攻击,首先要先放一个fastbin大小的堆块,然后通过申请0x1000,触发malloc consolidate的处理,把堆块放到small bin中,才能开始我们的攻击,需要的条件:
有3个堆块,small bin中的free_chunk(能控制bk),fake_chunk(能控制fd和bk)、fake_chunk的bk指向的fake_chunk2(能控制fd),实现的链子如下:
free_chunk:0x25f20a0 、fake_chunk:0x25f2000 、fake_chunk2:0x25f2140,同时把指针构造好了:
下面申请0x68的大小,得到free_chunk,结果如下:
再申请就得到了fake_chunk,结果如下:
对fake_chunk修改:
1 | edit(8,'oooooooo') |
对原始0号块修改:
1 | edit(0,'pppppppp') |
这样就有2个指针可以操作这个堆块,0和8,有了fake_chunk,就可以改内存了,演示就结束了,通过这种攻击,就可以实现,申请出任意地址的堆块,我想到的利用是:申请出bss上的内存块!
small bin中的free_chunk
bss中的fake_chunk(被申请的victim)
bss中的fake_chunk2
(需要满足的条件是UAF改bk指针、bss地址知道且可写、heap地址知道,随意的是bss中的chunk都不检查size很爽,满足指针即可,和large bin的分配有点相似的地方,也是可以申请出fake_chunk,但是比largebin简单。