1. 程式人生 > >Double Free

Double Free

size wifi 鏈接 bbs payload article http margin 利用

0x00 漏洞的原理

Double Free其實就是同一個指針free兩次。雖然一般把它叫做double free。其實只要是free一個指向堆內存的指針都有可能產生可以利用的漏洞。double free的原理其實和堆溢出的原理差不多,都是通過unlink這個雙向鏈表刪除的宏來利用的。只是double free需要由自己來偽造整個chunk並且欺騙操作系統。

0x01 Double利用思路

1.第一步

首先申請兩塊堆內存:

chunk1 = malloc(504)
chunk2 = malloc(512)

如下圖:

技術分享

2.第二步

然後釋放這兩個堆

free(chunk1)
free(chunk2)

不過並沒有釋放這兩個內存,chunk1和chunk2依然指向free之前的堆內存

3.第三步

再申請一個新的堆

chunk3 = malloc(1024)

不過這個新的堆要時前面兩個堆大小的和,所以系統會把之前分派的內存給返回。如下圖

技術分享

4.第四步

在chunk3中我們構造一個偽chunk(fake_chunk),同unlink.我們也需要一個指向chunk1的指針,向chunk3中輸入:

payload = (prev_size = 0) + (size = 0x1F8) + (fd = ptr - 0x0c) + (bk = ptr - 0x08) + ‘a‘*(0x1F8 - 0x10) + (prev_size = 0x1F8) + (size = 0x208)

如圖所示:

技術分享

5.第五步

最後執行

free(chunk2)

這裏就和unlink是一樣的了,向後合並,最終ptr指向ptr - 0x0C,就可以對任意地址進行寫操作了。

0x02 參考鏈接

Double Free淺析

看雪.Wifi萬能鑰匙 CTF 2017 第4題Writeup---double free解法

Double Free