利用 unsorted bin泄漏 libc基址
【定义】
因为unsorted bin是双向链表,所以第一个unsorted bin的bk也就指向了bin[1],如果我们能够打印出第一个unsorted bin的bk,也就相当于得到了bins[1]地址,而因为bins[1]在libc中,所以也就相当于得到了libc基址
【实现方法】
因为我们一般show_chunk是需要我们这个bin是allocated状态(也就是有p2chunk指向它),但想要有fd又需要我们将它free掉
这在UAF作为起点的情况下很容易实现,但若是在堆越界写的起点下,就要采用以下方法才能实现:
我们可以通过操作先实现让两个p2chunk指向同一个unsorted大小的allocated块,然后再free掉一个p2chunk,具体操作如下:
1、我们先创建以下这4个块:

女神想要不止被p2chunkD插还想同时再被p2chunkA插,所以就要女生的工具人C出手,从工具人的工具人1号手里抢走p2chunkA送给女神,而这个抢走的过程又需要借助工具人的工具人二号对工具人C进行越界写来实现抢走
其中因为女神要用来实现unsorted bin泄漏 libc基址,所以她的大小必须是unsorted bin范围的
大概思路就是这样,然后我们开始:
2、现在我们先free掉两个块
free(p2chunkC)
free(p2chunkA)
让工具人的工具人一号以为他要被工具人C宠幸了

3、然后我们让工具人的工具人2号溢出覆写工具人C,覆写fd让它指向女神
没想到吧,一号,你只是个用来达成我目的的工具人罢了!

这样一来,相比于直接free(p2chunkD)会直接把p2chunkD置零掉,这么搞就不仅相当于free掉了D,又没有消耗掉p2chunkD而是作为替代地消耗掉了p2chunkA
4、然后我们现在再malloc两次
就会变成这样:

这里注意以下,最好再来个工具人夹在工具人C和女神中间,先把女神覆写为fastbin大小,再malloc女神出来,再覆写成unsorted bin大小。因为malloc时想要回收利用一个unsorted bin的规则有点复杂
5、最后,我们再free(p2chunkD),女神被free为unsorted bin,此时它就自动被设置了bk,但又因为还有一个p2chunkA指向它,所以我们这时print(p2chunkA),就可以打印出bk的值也就是泄漏libc基址啦~
至于其他那些工具人呢?哦,他们已经没用了不用理他们,这就是甜构的下场8