0x00前言
这个题目做了好几天,因为自己对这个堆利用还不是很明白,就磨了几天,终于在昨天稍微对于这个有了进一步的了解,WP其他各大师傅已经写过了,我主要是写一下我不理解的地方:为什么第三次申请的时候就可以把内容写进去。
0x10 分析步骤
0x11 申请一次
![申请一次](http://guoyashuai.top/wp-content/uploads/2020/06/申请一次.png)
这是申请一次后的记录,申请的大小是16,0x08405fb是对应的print_content函数地址,然后接着的四个字节是我们输入内容的地址,就在(1,3)处,延续的是16字节。
这就是说,程序会先申请8个字节,前四个是函数,后四个是我们输入内容的地址。
0x20 申请两次
![申请两次](http://guoyashuai.top/wp-content/uploads/2020/06/申请两次.png)
申请两次和申请一次的分析基本一致。
0x30 释放两次
![再申请一次](http://guoyashuai.top/wp-content/uploads/2020/06/释放完.png)
我们可以发现,释放完之后,会在fastbin里形成链,然后我们就想,能否将之前作为前八个字节的内容的地址作为我们可以输入内容的content地址?
0x 40 再申请一次
![](http://guoyashuai.top/wp-content/uploads/2020/06/再申请一次-1024x517.png)
我们只需要申请的比之前的小,就比如我们申请的是12个字节,那么它就会把这个0x10所在的fastbin里的内容都给分配出来。
我们申请这一次的时候,它会把第二次申请的第一个八字节作为这一次的八字节,并把第一次申请的0x16大小的块分配给它,我们这一次就可以把content的前四个字节输入成magic的地址,然后print的时候相当于是进行了执行这个magic函数 。
然后就可以getshell了。
话说为什么这样就可以了呢?
这是由于,我们在最后print的是编号为0的堆块,它虽然已经被free掉了,但是没有置为null,那么我们再调用它的时候,就会调用magic函数,可以将再申请一次的图片和申请一次的图片进行对比,可以发现,此时的0x80485fb已经变成了0x8048945(magic地址),而这一段地址在print的时候就会被以为是原来的print_note_content函数,从而执行了magic。
这才是UAF的意义所在......
0x20 payload
![](http://guoyashuai.top/wp-content/uploads/2020/06/paylo-1024x434.png)