iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 3
0
Security

資安隨意分享的30天系列 第 3

Day3 - TCACHE 介紹(一)

前言

把之前研究一下的 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 這樣


上一篇
Day2 - 107 金盾初賽分享
下一篇
Day4 - TCACHE 介紹(二)
系列文
資安隨意分享的30天30

尚未有邦友留言

立即登入留言