常態堆與除錯態堆的區別

2021-07-23 14:48:43 字數 883 閱讀 6966

看過《0day安全:軟體漏洞分析技術》的童鞋們都知道在記憶體中的堆分兩種情況,一種為常態堆,另一種為除錯態堆。但自己以前在除錯的時候並沒有深刻領會到這一點。今天在除錯的時候偶然間深刻領會到這一點。下面分兩種情況來檢視堆塊的記憶體結構:

1. 常態堆

先開啟powerpoint,然後用windbg附加,執行。隨便開啟乙個ppt檔案。中斷後在windbg命令欄裡輸入擴充套件命令!heap檢視程序所有的堆。

選擇乙個堆裡的位址,開啟memory視窗,觀察一下這個位址的前後,很容易就找到該堆塊的頭部起始位址。我試驗的位址是0x03dc8900。輸入擴充套件命令檢視該堆塊的塊首資訊,當然如果熟練的話,可直接從記憶體裡看就行。

圖1 常態堆塊的塊首示意圖

從圖中我們可以看出flag標記為0x1,表示該堆塊為占用態。堆塊的大小為4個單位,乙個堆單位為8個位元組。再從memory視窗檢視整個完整的堆塊,如下圖

圖2 常態堆塊整個示意圖

可以看出堆塊的末尾沒有填充字元。

2.除錯態堆

用windbg開啟powerpoint,執行。再開啟乙個ppt檔案。中斷後按照上面的步驟檢視乙個堆塊的記憶體結構:

圖3 除錯態堆塊的塊首示意圖

從中我們可以看出flag標記變成了0x7,二進位製碼為0111,左邊第乙個1表示該堆塊處於除錯態(fill pattern)。右邊第乙個1表示堆塊處於占用態。

整個堆塊記憶體如下:

圖4 常態堆塊整個示意圖

堆的末尾從038e7e48開始有16個位元組的填充,8個ab和8個00,用來防止溢位。

總結:常態堆和除錯態堆管理策略有很大的差異,我們在進行漏洞除錯的時候,如果涉及到堆的話,最好不要用偵錯程式開啟程序而選擇attach,因為程式會檢測到程序處於除錯狀態。

一點點小收穫,拿出來跟大家分享,請大蝦們莫見笑。。。   :)

堆與棧區別

檢視文章 關於記憶體中棧和堆的區別 2008 09 02 17 12 1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器...

棧 與 堆 的區別

預備知識 堆與棧有什麼區別?一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束...

堆與棧的區別

堆與棧有什麼區別?一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由o...