【PWN】unlink exploit

堆机制

当一个small chunk被free掉时,会有如下操作:

  1. 检查是否能向后合并,如果相邻低位的chunk也处于被free的状态,则向后合并。

    • 合并两个chunk的内存
    • 修改当前chunk指针为前一个chunk指针
    • 触发unlink操作将前一个chunk从双向链表(bin)中移除
  2. 检查是否能向前合并,如果相邻高位的chunk处于被free的状态,则向前合并,同样能出发unlink 操作

unlink的操作为:

static void unlink_chunk (mstate av, mchunkptr p)
{
  if (chunksize (p) != prev_size (next_chunk (p)))
    malloc_printerr ("corrupted size vs. prev_size");
  mchunkptr fd = p->fd;
  mchunkptr bk = p->bk;
  if (__builtin_expect (fd->bk != p || bk->fd != p, 0))
    malloc_printerr ("corrupted double-linked list");
  fd->bk = bk;
  bk->fd = fd;
  if (!in_smallbin_range (chunksize_nomask (p)) && p->fd_nextsize != NULL)
    {
      if (p->fd_nextsize->bk_nextsize != p
          || p->bk_nextsize->fd_nextsize != p)
        malloc_printerr ("corrupted double-linked list (not small)");
      if (fd->fd_nextsize == NULL)
        {
          if (p->fd_nextsize == p)
            fd->fd_nextsize = fd->bk_nextsize = fd;
          else
            {
              fd->fd_nextsize = p->fd_nextsize;
              fd->bk_nextsize = p->bk_nextsize;
              p->fd_nextsize->bk_nextsize = fd;
              p->bk_nextsize->fd_nextsize = fd;
            }
        }
      else
        {
          p->fd_nextsize->bk_nextsize = p->bk_nextsize;
          p->bk_nextsize->fd_nextsize = p->fd_nextsize;
        }
    }
}

其中重要的操作为:(主要就是将chunk从双向链表中移除)

  mchunkptr fd = p->fd;
  mchunkptr bk = p->bk;
  fd->bk = bk;
  bk->fd = fd;

还有需要注意的检查:

if (chunksize (p) != prev_size (next_chunk (p)))
    malloc_printerr ("corrupted size vs. prev_size");

if (__builtin_expect (fd->bk != p || bk->fd != p, 0))
    malloc_printerr ("corrupted double-linked list");

Exploit

由于有了检查机制,所以unlink所能做的操作有所限制。具体操作为:

  1. 构造p->fd=(p)-12,p->bk=(p)-8
  2. 触发unlink(p)
  3. 于是unlink操作变为了 (p)=(p)-8 => (p)=(p)-12

所以最终结果为(p)指针-12,(p)可以是任何存放p指针的地方。
虽然操作有限,但在一些场合下可以与堆溢出user after free等配合,从而任意地址写。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 参考文章: 关于heap overflow的一些笔记 by ETenal [CTF]Heap vuln -- u...
    BJChangAn阅读 2,711评论 2 5
  • 最近做了一些堆的题,发现对unlink还是不太熟悉,所以回来做下笔记 unlink的目的:把一个双向链表中的空闲块...
    zs0zrc阅读 2,318评论 0 0
  • 昨天夜里11点接到电话骚扰,原因是之前答应朋友生日的时候给他买只表,不想对方现在就要。我以手头现钱不多为由婉拒对方...
    查特拉阅读 1,036评论 0 0
  • 听见了它哗哗的脚步 还以为它只是路过 几个晚上以后 它还在那走着 这勾起了我的兴趣 我与它交谈了一晚 它说它的前世...
    晴与向晴阅读 400评论 0 1
  • 欧洲之旅
    阿婆北阅读 109评论 0 0