Double Free
阿新 • • 發佈:2017-07-19
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