iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0

在之前的文章中,我們探討了與 Stack 相關的攻擊手法及其對應的保護機制。接下來的幾篇文章,將會把焦點轉向程式的另一個記憶體區域—Heap。


Heap 概念

Heap 的運作是基於程式需要動態分配的記憶體需求,這與 Stack 的固定大小分配不同。當程式需要大量記憶體且無法預知具體大小時,就會使用 Heap 進行管理。Heap 記憶體分配由系統中的動態記憶體管理器負責,在 glibc 上實現的 heap 的機制為 ptmalloc2,後續將會介紹此機制。

Heap 在記憶體中位於下方圖中這塊黃色的區域
image
它是由低地址到高地址生長的,只有當使用者向作業系統申請記憶體時,個個空間才會被分配出來,並且為了效能考量,一次會分一塊很大塊的連續記憶體空間。若開啟 ASLR 就會像圖上一樣,有隨機的偏移偏移量才是 Heap 的空間。

Heap 的大小是由 brk() 與 sbrk() 所控制的,當 Heap 尚未初始化時,有一個指標 program_break 會指向 Bss Segment 的最尾處。
image

  • brk():參數為一指標,用於設定 program_break 指向的位址,執行成功後會返回 0
  • sbrk():參數為一整數數值,此數值會與 program_break 相加來調整 program_break 的位址。

不論使用 brk() 還是 sbrk(),分配 Heap 後記憶體如下:
image
黃色的這片連續記憶體區塊即為 Heap,我們也會稱呼它為 main_arena。

下一篇文章將會說明如何向 Heap 申請空間。


上一篇
[Day17] Pwnable.tw 基礎題實戰(四)
下一篇
[Day19] Heap 介紹 - 基本操作
系列文
Pwn2Noooo! 執行即 Crash 的 PWNer 養成遊戲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言