【tcache stash unlink +】图解

tcache stashing unlink +

  1. tcache 的入链操作

    【tcache stash unlink +】图解

  2. smallbin 入链操作

    【tcache stash unlink +】图解

  3. 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 解链,绿色是未被攻击的情况, 红色是攻击的情况

        【tcache stash unlink +】图解

      • 第二次stash,就会将victim链入tcache,此时malloc就会申请到fake chunk

上一篇:大数据开发的工具有哪些?


下一篇:DataWorks答疑群