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