通过劫持线程arena,当堆开了一个线程之后,如果没有做好保护随之的危险也悄然而至 ❗
BUU上的n1ctf2018_null很好的说明了这个问题
看一下保护:
除了pie保护剩下的保护全开了,64位ida载入看一下
上来是一个输入密码,密码是im ready for challenge ,随后登录成功,创建了一个新的线程
我们进去看看
是一个死循环,可以看见对输入的chunk大小以及数量都是非常大的,而且程序还有一个溢出我们看一下sub_400bca
那么可以看见当我们输入的内容比size小的时候,我们可以二次输入这次最大可以输入size的大小,原因是a2没有进行更新,那么这里有溢出点
我们再看一下它下面的函数
如果我们能修改此处的地址为system,而参数是/bin/sh那么我们就可以得到shell
如果我们溢出的字节足够大可以覆盖线程arena,那么我们可将fake_chunk链接到fastbin,进而分配我们想要的地址,但是arena是先mmap出来的,heap是过后才分配出来,所以我们覆盖不了线程arena,但是如果,我们把这块内存耗完会发生什么,那么系统会重新分配mmap一段内存,但是由于它后面是libc的地址,所以它会往前面找一块地址,那么我们输入的内容就可能在线程arena的前面,我们先申请这么大看看
看一下vmmap
我们看一下此处内容,从链表特征上来看,这是一个线程arena结构,它位于地址较低的地方
、
看看我们输入的内容的位置
计算一下
那么我们加刚刚申请的这个是262个,我们再申请262个看看
我们输入的数据在它前面,那么可以看见我们再利用二次输入数据是可以覆盖线程arena的
现在计算偏移进行覆盖
填充0x50个垃圾数据覆盖到线程arena,这里注意这里有个大小我们不要随意去改变,可以适当改最前面的一个字节,不然会出现一系列的问题
后面我们在把我们的fake_chunk接上去
那么此时我们再次申请chunk就会申请到假chunk
选择0x60201d的原因是这里可以伪造假chunk的size位
然后我们把0x602038的地方改成system的plt地址
然后申请0x60大小的chunk就可以申请到fake_chunk
程序会把rbp-8处的位置给rdi,而且这个位置就是我们申请chunk输入的数据,随后call rax(0x602038)进而得到shell,记得补齐到0x60哦✅
wp:
__EOF__