tcache stashing unlink +
-
tcache 的入链操作
-
smallbin 入链操作
-
tcache stash
-
源码
#if USE_TCACHE /* While we're here, if we see other chunks of the same size, stash them in the tcache. */ size_t tc_idx = csize2tidx (nb); if (tcache && tc_idx < mp_.tcache_bins) { mchunkptr tc_victim; /* While bin not empty and tcache not full, copy chunks over. */ while (tcache->counts[tc_idx] < mp_.tcache_count && (tc_victim = last (bin)) != bin) //注意这个结束条件 { if (tc_victim != 0) { bck = tc_victim->bk; //这里victim的bk被我们修改了,bck为我们修改的值 &victim — 0x10 set_inuse_bit_at_offset (tc_victim, nb); if (av != &main_arena) set_non_main_arena (tc_victim); bin->bk = bck;//victim 成为small bin的尾节点 bck->fd = bin;//victim的fd被设置为small bin //这里需要注意的是victim + 0x8需要提前设置,作为victim的bk tcache_put (tc_victim, tc_idx); } }
-
实际操作
-
第一次stash,虚线是small bin 解链,绿色是未被攻击的情况, 红色是攻击的情况
-
第二次stash,就会将victim链入tcache,此时malloc就会申请到fake chunk
-
-