iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0

在分配記憶體時,glibc 的分配器採用了一種稱為 First Fit 的策略來優化記憶體分配過程。

First Fit

當程式呼叫 malloc() 來請求動態記憶體分配時,記憶體管理器會根據先前已釋放的空閒區塊來滿足請求。這個過程根據先到先得的原則,從可用的空閒記憶體中,選擇第一個符合請求大小的區塊來分配給程式。

Unsorted Bin 是存放剛釋放的記憶體區塊的第一個 bin,釋放的記憶體首先進入這個 bin。當有記憶體請求時,glibc 會先從 unsorted bin 開始查找。若找到的區塊大於請求的大小,glibc 會將其切割為兩個區塊,一個滿足請求,另一個繼續作為空閒區塊存放。

以下程式碼為例,說明 First Fit 的行為:

char *a = malloc(300);    // 0x***010
char *b = malloc(250);    // 0x***150

free(a);

a = malloc(250);          // 0x***010
  1. 分配區塊:
    malloc(300) 會分配一個 300 bytes 的區塊,記憶體地址為 0x***010。
    malloc(250) 會分配另一個 250 bytes 的區塊,記憶體地址為 0x***150。
  2. 釋放第一個區塊:
    呼叫 free(a) 釋放記憶體區塊 0x***010。此時,該區塊進入 Unsorted Bin 並標記為空閒。
  3. 重新分配:
    當再次呼叫 malloc(250) 時,glibc 會從 Unsorted Bin 的尾部查找空閒區塊。由於 0x***010 的大小(300 bytes)大於請求的大小(250 bytes),它會被選中(First Fit 行為)。
    該區塊被切割為兩部分:a1(250 bytes,滿足請求)和 a2(剩餘的 50 bytes),a1 被返回作為新的分配區塊,地址仍然是 0x***010。

First Fit 的策略會導致已經釋放的記憶體區塊被重新使用。如果程式中不小心再次使用已經釋放的記憶體(如未經妥善處理的指標),可能會導致 Use-After-Free 的安全漏洞,讓記憶體的內容可能被新的分配覆蓋,藉此利用這一點操控程式的行為。


上一篇
[Day21] Heap 介紹 - Chunk
下一篇
[Day23] Heap 漏洞 - Use After Free
系列文
Pwn2Noooo! 執行即 Crash 的 PWNer 養成遊戲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言