認識堆溢位

2021-08-29 15:59:20 字數 1632 閱讀 9255

學習資料:

之前學了一些棧溢位的知識和方法,首先比較了一下堆溢位和它的區別

堆上並不存在返回位址等可以讓攻擊者直接控制執行流程的資料,因此我們一般無法直接通過堆溢位來控制 eip

那怎麼辦呢,第一步要了解一些堆的知識,一邊學的時候一邊查詢就好了,知識點我只看了簡單的部分

堆溢位和棧溢位的危險函式都差不多

輸出

字串 堆溢位肯定需要覆蓋區域的大小:和棧溢位不同的是(我們請求多少棧空間就給多少),申請對空間的時候不知道為什麼對我們特別好,偏要多給我們一點,為什麼會多一些呢?,有兩個原因:對齊;堆頭部

對齊就不多做介紹了,搜一下就好了,無非就是32位與64位的不同

說到堆頭部,就可以介紹一下堆的結構是什麼樣的了

struct malloc_chunk ;
prev_size:前一塊chunk的大小(若前一塊chunk空閒,否則存放前一塊chunk的資料,這也就是chunk的復用)

size:

該 chunk 的大小

fd,bk:

chunk 處於分配狀態時,從 fd 字段開始是使用者的資料。chunk 空閒時,會被新增到對應的空閒管理鍊錶中,其字段的含義如下

fd 指向下乙個(非物理相鄰)空閒的 chunk

bk 指向上乙個(非物理相鄰)空閒的 chunk

通過 fd 和 bk 可以將空閒的 chunk 塊加入到空閒的 chunk 塊鍊錶進行統一管理

fd_nextsize, bk_nextsize:

也是只有 chunk 空閒的時候才使用,不過其用於較大的 chunk(large chunk)。

fd_nextsize 指向前乙個與當前 chunk 大小不同的第乙個空閒塊,不包含 bin 的頭指標。

bk_nextsize 指向後乙個與當前 chunk 大小不同的第乙個空閒塊,不包含 bin 的頭指標。

一般空閒的 large chunk 在 fd 的遍歷順序中,按照由大到小的順序排列

那我們就可以推斷出分配的記憶體是多少了,借用ctfwiki中的例子,假設在64位程式中,我們申請24位元組的堆空間

首先chunk頭部16位元組是不能存放我們需要的資料的,但是還是需要申請

再則因為本快堆已經被分配了,所以下一塊的pre可以寫奔塊堆的資料,可以多用8位元組

所以實際分配的位元組大小:24+16-8=32位元組

稍微看了一下堆溢位的小技巧之後,覺得認識堆**之後的管理也是重要的

以下來自ctfwiki

除了fastbin,一共128個bin放在一起,這些要麼極其有規律,要麼極其沒規律,搜一下就好了,這裡單獨提一下fastbin,如下圖

還有一些像top chunk和last remainder還算好理解,就暫時不介紹了

這些就是chunk大概得了,其實頂上依次還有heap和arena,暫時可能hold不住就先不了解了

堆溢位利用

0x1 申請 0x2 使用 0x3 釋放 堆塊包括塊首與塊身 返回的指標指向 塊首是乙個堆塊頭部的幾個位元組,用來標識這個堆塊自身的資訊。未被占用的堆區 被占用的堆區 位於堆區的起始位置,堆表分為兩種空閒雙向鍊錶freelist 空表 128條 和快速單向鍊錶lookaside 快表 最多只有四項 ...

初步認識堆

如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2i 1 且 ki k2i 2 ki k2i 1 且 ki k2i 2 i 0,1,2 則稱為小堆 或大堆 將根節點大的叫大堆,根節點小的叫小堆。堆的特點 每個節點比他的孩子節點小 堆是乙個完全二...

什麼是棧溢位和堆溢位

棧溢位是由於c語言系列沒有內建檢查機制來確保複製到緩衝區的資料不得大於緩衝區的大小,因此當這個資料足夠大的時候,將會溢位緩衝區的範圍。堆溢位的產生是由於過多的函式呼叫,導致呼叫堆疊無法容納這些呼叫的返回位址,一般在遞迴中產生。堆溢位很可能由無限遞迴 infinite recursion 產生,但也可...