把之前研究一下的 TCACHE 拿來分享一下好了
今天要介紹的是 GLIBC 在 2.26 更新上去的優化機制 (thread local caching, tcache)
這邊探討的 Linux 版本以 Ubuntu 來看,要到 Ubuntu 17.10 (glibc 2.26) 後才會有
以 CTF 來說,現在好像有些都改用 Ubuntu 18.10 ,這樣就會有這個機制,
那像去年都是 Ubuntu 16.04 , 就不會有這個優化機制。
先總結一下這個優化機制的做法,他是在 malloc() 和 free() 時,不走以前的 code ,
在前面新增一段優化的程式碼,只要你符合他要求的 chunk size (fastbin & smallbin) ,
就會優先使用這優化機制
具體而言,他增加了兩個結構
第一個是 tcach_entry
,底下是他的 source code:
typedef struct tcache_entry
{
struct tcache_entry *next;
} tcache_entry;
其實這邊可以直接把她當成是 fastbin 來看,基本都相同
主要的差別在 fastbin 的 fd 指向 chunk header ,而 tcache_entry 的 next pointer 指向的是 user data
這個差別就是在算記憶體位置時,會差 0x10 這樣
那另一個結構是 tcache_perthread_struct
,底下是他的 source code
typedef struct tcache_perthread_struct
{
char counts[TCACHE_MAX_BINS];
tcache_entry *entries[TCACHE_MAX_BINS];
} tcache_perthread_struct;
這個結構管理了整個 tcache ,這邊直接講他的 source code 好了
TCACHE_MAX_BINS
預設是 64 ,代表他預設只有 64 個 entry ,然後上面的 counts
是紀錄每個 entry 存了幾個 chunk ,預設最多可以存 7 個
把上面這段話講得白話一點就是
tcache 預設只有對 64 個不同大小的 chunk 做 cache ,預設每種 size 只 cache 7 個 chunk 這樣
那因為他新增兩個資料結構,所以她也新增兩個函數來操作
第一個是 tcache_get
其實可以直接把它看成是用在 tcache 的 malloc
第二個是 tcache_put
其實可以直接把它看成是用在 tcache 的 free
今天先講到這好了
那為啥要了解 tcache 呢? 因為現在新的 glibc 使用這個優化機制嘛,只要你 malloc 的大小符合就會優先走
tcache 的機制,換句話說,如果要打 heap exploitation ,就需要知道一下 tcache 這樣