heap思路總結(jié)

分析方法:
全局變量位置布局: 哪些在.bss,哪些在.data,變量之間的關(guān)系
哪些變量, 緩沖區(qū), 數(shù)組,存儲了哪些值(別的變量,別的地址,申請的堆地址)
使用的數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu)中成員之間的關(guān)系,地址位置關(guān)系,各個成員大小及其含義.
程序處理數(shù)據(jù)結(jié)構(gòu)的方法:存儲方式,遍歷方式,查找方式.操作方法(創(chuàng)建,修改,打印,刪除.增刪改查各種操作)

是否有數(shù)組越界, 整數(shù)溢出(處理不好負數(shù),處理不好0,-1后又變成全f), 長度判斷錯誤,沒有進行長度判斷,將用戶提供的長度直接去申請內(nèi)存,
是否有uaf,是否有double free,是否有懸掛指針

分析使用了什么bin:fastbin, smallbin, unsorted bin, top chunk 能否利用
錯誤的unlink對棧, bss,.data等進行操作

一般大結(jié)構(gòu)體對應(yīng)的申請的堆地址會存儲在bss上的全局變量. 可用于unlink將其中一個地址指向改全局變量前面,操作該堆內(nèi)容時就會操作到該全局變量.(unlink的套路)
1.off by one
http://www.itdecent.cn/p/046a6b0578fc

2.unlink

3.uaf
http://www.itdecent.cn/p/1b0b773a8c7f

4.fastbin attack
fastbin double free 也是一種修改fd指向來在任意地址分配內(nèi)存,可以在某個可以被編輯的全局指針處,malloc_hook處亦可以
偽造fastbin chunk,強制釋放后再次申請到這片內(nèi)存(需要繞過很多檢查)
修改fastbin中chunk的fd指向stack或者其他地方中偽造的fast chunk,多次申請內(nèi)存后得到目標(biāo)地址內(nèi)存(只需要繞過size檢查),
可通過前一個chunk的堆溢出修改下一個chunk的fd和其他chunk的size域. 這種方式可以結(jié)合unsorted bin泄漏libc和修改fd申請到
malloc_hook進行g(shù)etshell.
實例1:
實例2: http://www.itdecent.cn/p/5b0a1b168fed

5.Chunk Extend and Overlapping
1).篡改前一個塊大小,釋放后把后一個塊合起來free到fastbin中:
0x602000: 0x0000000000000000 0x0000000000000041 <=== 篡改大小
0x602010: 0x0000000000000000 0x0000000000000000
0x602020: 0x0000000000000000 0x0000000000000021 這個chunk屬于bin中的某個chunk
0x602030: 0x0000000000000000 0x0000000000000000
0x602040: 0x0000000000000000 0x0000000000020fc1

2).small bin:篡改的時機在釋放前后都是可以的,因為unsorted bin大小不同的chunk可共存.
而fastbin不能在free后篡改,因為bin的鏈表大小是相同的,就算改了也不會找到這個塊進行分配.
0x602000: 0x0000000000000000 0x00000000000000b1 <=== 被放入unsorted bin, 篡改為0xb0大小
0x602010: 0x00007ffff7dd1b78 0x00007ffff7dd1b78
0x602020: 0x0000000000000000 0x0000000000000000
0x602030: 0x0000000000000000 0x0000000000000000
0x602040: 0x0000000000000000 0x0000000000000000
0x602050: 0x0000000000000000 0x0000000000000000
0x602060: 0x0000000000000000 0x0000000000000000
0x602070: 0x0000000000000000 0x0000000000000000
0x602080: 0x0000000000000000 0x0000000000000000
0x602090: 0x0000000000000000 0x0000000000000021
0x6020a0: 0x0000000000000000 0x0000000000000000 一直extend到這里
0x6020b0: 0x00000000000000b0 0x0000000000000020 <=== 注意此處標(biāo)記為空,這個塊防止與top chunk合并
0x6020c0: 0x0000000000000000 0x0000000000000000
0x6020d0: 0x0000000000000000 0x0000000000020f31 <=== top chunk

3)fastbin 的后向extend多個塊:
ptr=malloc(0x10);//分配第1個 0x80 的chunk1
malloc(0x10); //分配第2個 0x10 的chunk2
malloc(0x10); //分配第3個 0x10 的chunk3
malloc(0x10); //分配第4個 0x10 的chunk4
*(int *)((int)ptr-0x8)=0x61;
free(ptr);
ptr1=malloc(0x50);這個包含了后3個堆,可完全控制它們

4)各種塊的前向extend:
ptr1=malloc(128);//smallbin1
ptr2=malloc(0x10);//fastbin1
ptr3=malloc(0x10);//fastbin2
ptr4=malloc(128);//smallbin2
malloc(0x10);//防止與top合并
free(ptr1);
*(int *)((long long)ptr4-0x8)=0x90;//修改pre_inuse域
*(int *)((long long)ptr4-0x10)=0xd0;//修改pre_size域
free(ptr4);//unlink進行前向extend
malloc(0x150);//占位塊,可以控制前面4個塊

6.House Of xxx:
1)House Of Einherjar:通過溢出(一般是堆溢出)修改in_use,主動觸發(fā)free后進行合并,且此時prev_size可是可控的,達到再次申請到任意地址內(nèi)存的效果
實例:http://www.itdecent.cn/p/dbf0d8adc736
2)House of Lore
類似于修改fastbin的fd指針一樣修改small bin的bk,從而在指定位置申請內(nèi)存.
3)House Of Force
這個是針對top chunk size 的纂改,可以使得 top chunk 指向我們期望的任何位置,這就相當(dāng)于一次任意地址寫,一般通過堆溢出寫入size為-1
首先,需要存在漏洞使得用戶能夠控制 top chunk 的 size 域。
其次,需要用戶能自由控制 malloc 的分配大小
第三,分配的次數(shù)不能受限制
size計算:
目標(biāo)地址t, top chunk 地址s
按理說的大小是 w=t-s
但是輸入i要滿足((i) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK=w
而MALLOC_ALIGN_MASK = 2 * SIZE_SZ -1
實例1:HITCON training lab 11
s=0xa4e060
t=0xa4e000
w=t-s=-0x60 由于這個值已經(jīng)是對~MALLOC_ALIGN_MASK對齊(就是看低16bit位全為0就已經(jīng)對齊了,
此時w&~MALLOC_ALIGN_MASK還是=w)
i=w- SIZE_SZ - MALLOC_ALIGN_MASK
實例二:
4)House of Rabbit
一般運用在 fastbin attack 中,利用了在 malloc consolidate 的時候 fastbin 中的堆塊進行合并時 size 沒有進行檢查從而偽造一個假的堆塊.
可以通過修改size字段(堆溢出),再分配大內(nèi)存觸發(fā)合并
也可以通過uaf修改fd觸發(fā)

5)House of Roman

7.Unsorted Bin Attack
Unsorted Bin Attack 被利用的前提是控制 Unsorted Bin Chunk 的 bk 指針。重要!!(一般通過堆溢出覆蓋已被釋放到unsortedbin中的chunk)
Unsorted Bin Attack 可以達到的效果是實現(xiàn)修改任意地址值為一個較大的數(shù)值。
當(dāng)一個較大的 chunk 被分割成兩半后,如果剩下的部分大于 MINSIZE,就會被放到 unsorted bin 中。
釋放一個不屬于 fast bin 的 chunk,并且該 chunk 不和 top chunk 緊鄰時,該 chunk 會被首先放到 unsorted bin 中。
插入的時候插入到 unsorted bin 的頭部,取出的時候從鏈表尾獲取。
當(dāng)進行 malloc_consolidate 時,可能會把合并后的 chunk 放到 unsorted bin 中,如果不是和 top chunk 近鄰的話。
可用于泄漏地址和任意地址寫固定大數(shù)據(jù).

  1. .tcache
    tcache poisoning :類似于fastbin中的chunk的fd被修改,但是修改tcache的fd不需要size驗證
    tcache dup:類似于double free或者修改fd形成的循環(huán)鏈表.且沒有檢測可以t->a->t...
    tcache house of spirit;強制對某塊進行釋放,沒有對齊檢測
    tcache unlink: 在 smallbin 中包含有空閑塊的時候,會同時將同大小的其他空閑塊,放入 tcache 中,此時也會出現(xiàn)解鏈操作,但相比于 unlink 宏,缺少了鏈完整性校驗。因此,原本 unlink 操作在該條件下也可以使用。例子:
    利用unsorted bin泄漏libc需要將tcache填滿才行.就這個導(dǎo)致了一些麻煩而已
    內(nèi)存釋放:
    在 free 函數(shù)的最先處理部分,首先是檢查釋放塊是否頁對齊及前后堆塊的釋放情況,便優(yōu)先放入 tcache 結(jié)構(gòu)中。
    內(nèi)存申請:
    (1)首先,申請的內(nèi)存塊符合 fastbin 大小時并且找到在 fastbin 內(nèi)找到可用的空閑塊時,會把該 fastbin 鏈上的其他內(nèi)存塊放入 tcache 中。
    (2)其次,申請的內(nèi)存塊符合 smallbin 大小時并且找到在 smallbin 內(nèi)找到可用的空閑塊時,會把該 smallbin 鏈上的其他內(nèi)存塊放入 tcache 中。
    (3)當(dāng)在 unsorted bin 鏈上循環(huán)處理時,當(dāng)找到大小合適的鏈時,并不直接返回,而是先放到 tcache 中,繼續(xù)處理。

9.IO_FILE
1)偽造vtable指針指向別處,再該處寫入要劫持的對象和內(nèi)容. 實例:
http://www.itdecent.cn/writer#/notebooks/32246030/notes/40290385
2)FSOP 文件流導(dǎo)向編程.
劫持_IO_list_all 的值來偽造鏈表和其中的_IO_FILE 項
觸發(fā):FSOP 選擇的觸發(fā)方法是調(diào)用_IO_flush_all_lockp,這個函數(shù)會刷新_IO_list_all 鏈表中所有項的文件流,相當(dāng)于對每個 FILE 調(diào)用 fflush,也對應(yīng)著會調(diào)用_IO_FILE_plus.vtable 中的_IO_overflow。
如何觸發(fā)?:
當(dāng) libc 執(zhí)行 abort 流程時
當(dāng)執(zhí)行 exit 函數(shù)時
當(dāng)執(zhí)行流從 main 函數(shù)返回時
條件:泄漏libc基址, 任意地址寫修改_IO_list_all
繞過: fp->_mode <= 0; fp->_IO_write_ptr > fp->_IO_write_base
3)2.24版本及以上多了檢測.很難劫持vtable了
scanf讀入數(shù)據(jù)時會先將數(shù)據(jù)寫入到IO_FILE中的char* _IO_buf_base; /* Start of reserve area. /
char
_IO_buf_end; /* End of reserve area. */ 地址中,這些地址是通過heap分配的.
如果修改了這些地址,就可以往別處寫入數(shù)據(jù)了.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 參考文章: 關(guān)于heap overflow的一些筆記 by ETenal [CTF]Heap vuln -- u...
    BJChangAn閱讀 2,830評論 2 5
  • 剛剛洗澡,看著屋子里朦朧的水汽,眼睛模糊,意識遨游。 二十幾歲的年紀,本該是身強力壯火力旺的時候吧??赡苁沁@幾天生...
    孟一行閱讀 520評論 0 2
  • 在這件事情中,如果換作一個是正常情緒下的老公老婆,同樣的事情,男人看到車來把車開走,女人會怎么說,會說:剛才你把車...
    靜斯基閱讀 286評論 0 0
  • 姓名:鄧平云 深圳蔚藍時代商業(yè)管理有限公司南京分公司 【日精進打卡第145天】 【知~學(xué)習(xí)】 《六項精進大綱 》1...
    鄧平云閱讀 131評論 0 0
  • 2017年初最火的書應(yīng)該是以色列作家赫拉利的新作《未來簡史》了,這本書的后面提出了一個概念,一切的信息必須產(chǎn)生鏈...
    人一己百閱讀 164評論 0 0

友情鏈接更多精彩內(nèi)容