0x1 申請
0x2 使用
0x3 釋放
堆塊包括塊首與塊身(返回的指標指向),塊首是乙個堆塊頭部的幾個位元組,用來標識這個堆塊自身的資訊。
未被占用的堆區
被占用的堆區
位於堆區的起始位置,堆表分為兩種空閒雙向鍊錶freelist(空表 128條)和快速單向鍊錶lookaside(快表 最多只有四項)
堆區一開始的堆表區中有乙個128項的指標陣列(看到有人說把它看成佇列的),被稱作空表索引。該陣列的每一項包含兩個指標,用於表示一條空表。free[1] 標識了所有堆中所有大小為8位元組的空閒堆塊,之後每個索引指示的空閒堆塊遞增8個位元組。即:
free[2]標識了16個位元組的空閒堆塊。
free[k] 標識了 k * 8 個位元組的空閒堆塊。
空閒雙向鍊錶freelist(空表)
快速單向鍊錶lookaside(快表)
堆塊的分配有三類:
- 塊表分配
- 普通表份分配
- 零號表分配(free[0])
堆的申請首先在快表中查詢,如果沒有去普通表中查詢,如果還沒有從記憶體空間分配。
直接利用堆表中的指標查詢堆塊,利用返回的指標使用堆記憶體,並對其操作。
堆的釋放首先釋放在快表中,如果快表滿了再釋放到普通表中。
空表 記憶體分布
0x00520178
freelist
[0]
0x00520188
freelist
[1]0x00520198
freelist
[2]0x005201a8
freelist
[3]塊區
0x00520680
h1 (加上8byte頭位元組)
0x00520690
h20x005206a0
h30x005206b0
h4快表 記憶體分布
0x003606e8
lookaside
[1]0x00360718
lookaside
[2]0x00360748
lookaside
[3]0x00360788
lookaside
[4]堆區
0x00361e98
h10x00361ea8
h30x00361e98
h5
認識堆溢位
學習資料 之前學了一些棧溢位的知識和方法,首先比較了一下堆溢位和它的區別 堆上並不存在返回位址等可以讓攻擊者直接控制執行流程的資料,因此我們一般無法直接通過堆溢位來控制 eip 那怎麼辦呢,第一步要了解一些堆的知識,一邊學的時候一邊查詢就好了,知識點我只看了簡單的部分 堆溢位和棧溢位的危險函式都差不...
什麼是棧溢位和堆溢位
棧溢位是由於c語言系列沒有內建檢查機制來確保複製到緩衝區的資料不得大於緩衝區的大小,因此當這個資料足夠大的時候,將會溢位緩衝區的範圍。堆溢位的產生是由於過多的函式呼叫,導致呼叫堆疊無法容納這些呼叫的返回位址,一般在遞迴中產生。堆溢位很可能由無限遞迴 infinite recursion 產生,但也可...
spark sql 堆外記憶體溢位
執行執行spark sql 指令碼檔案,爆出對堆外記憶體溢位 gc overhead limit execeeded 錯誤如下圖,先區分發生異常是executor端還是driver端,我遇到的問題是driver端,因為最後資料匯出生成檔案,資料會在driver端收集結果集。解決方式有兩種,第一種正大...