利用 unsorted bin泄漏 libc基址
【定義】
因?yàn)閡nsorted bin是雙向鏈表,所以第一個(gè)unsorted bin的bk也就指向了bin[1],如果我們能夠打印出第一個(gè)unsorted bin的bk,也就相當(dāng)于得到了bins[1]地址,而因?yàn)閎ins[1]在libc中,所以也就相當(dāng)于得到了libc基址
【實(shí)現(xiàn)方法】
因?yàn)槲覀円话鉺how_chunk是需要我們這個(gè)bin是allocated狀態(tài)(也就是有p2chunk指向它),但想要有fd又需要我們將它free掉
這在UAF作為起點(diǎn)的情況下很容易實(shí)現(xiàn),但若是在堆越界寫的起點(diǎn)下,就要采用以下方法才能實(shí)現(xiàn):
我們可以通過操作先實(shí)現(xiàn)讓兩個(gè)p2chunk指向同一個(gè)unsorted大小的allocated塊,然后再free掉一個(gè)p2chunk,具體操作如下:
1、我們先創(chuàng)建以下這4個(gè)塊:

女神想要不止被p2chunkD插還想同時(shí)再被p2chunkA插,所以就要女生的工具人C出手,從工具人的工具人1號(hào)手里搶走p2chunkA送給女神,而這個(gè)搶走的過程又需要借助工具人的工具人二號(hào)對(duì)工具人C進(jìn)行越界寫來實(shí)現(xiàn)搶走
其中因?yàn)榕褚脕韺?shí)現(xiàn)unsorted bin泄漏 libc基址,所以她的大小必須是unsorted bin范圍的
大概思路就是這樣,然后我們開始:
2、現(xiàn)在我們先free掉兩個(gè)塊
free(p2chunkC)
free(p2chunkA)
讓工具人的工具人一號(hào)以為他要被工具人C寵幸了

3、然后我們讓工具人的工具人2號(hào)溢出覆寫工具人C,覆寫fd讓它指向女神
沒想到吧,一號(hào),你只是個(gè)用來達(dá)成我目的的工具人罷了!

這樣一來,相比于直接free(p2chunkD)會(huì)直接把p2chunkD置零掉,這么搞就不僅相當(dāng)于free掉了D,又沒有消耗掉p2chunkD而是作為替代地消耗掉了p2chunkA
4、然后我們現(xiàn)在再malloc兩次
就會(huì)變成這樣:

這里注意以下,最好再來個(gè)工具人夾在工具人C和女神中間,先把女神覆寫為fastbin大小,再malloc女神出來,再覆寫成unsorted bin大小。因?yàn)閙alloc時(shí)想要回收利用一個(gè)unsorted bin的規(guī)則有點(diǎn)復(fù)雜
5、最后,我們?cè)賔ree(p2chunkD),女神被free為unsorted bin,此時(shí)它就自動(dòng)被設(shè)置了bk,但又因?yàn)檫€有一個(gè)p2chunkA指向它,所以我們這時(shí)print(p2chunkA),就可以打印出bk的值也就是泄漏libc基址啦~
至于其他那些工具人呢?哦,他們已經(jīng)沒用了不用理他們,這就是甜構(gòu)的下場8