特殊的Unlink Attack

  • HITCON CTF 2014上,有一道只有三支队伍解出的题目

    • Pwnables 550 - stkof
  • 解出题目的是以下三支队伍:

    • tomcr00se
    • PPP
    • teamlol
  • 介绍一下用于解决这道题目的技术

    • 这道题目是x86_64的二进制程序,但我会用x86的内存布局来说明它
    • 注意,实际的二进制中,各个区域都是两倍
  • 如果能够满足下述约束条件,就能够进行特殊的Unlink Attack

    • P->fd->bk == P
    • P->bk->fd == P
    • 不仅需要堆溢出,Use After Free也是必须的

    img

exploit的流程

  • 假设预先存在指向P的X

    • X在.bss区域中,并且预先知道地址
    • X指向已经free的P,就像它尚未被释放一样
    • 我们无法控制X指向的地址

    img

  • 通过堆溢出进行覆盖

    • P->fd:X之前12字节

    • P->bk:X之前8字节

      如图所示:

    img

  • 从X-0xC的位置开始看的话,X相当于bk的位置

  • 从X-0x8的位置开始看的话,X相当于fd的位置

  • 也就是说,P->fd->bk == X-0xC->bk == X == P && P->bk->fd == X-0x8->fd == X == P,满足条件

    img

  • free(P2)的时候,相连接的P被unlink

    img

  • 本应该无法控制的X的值现在可以被更改

    • X应该最初指向P

    img

  • X的指向(=*X),存在保存用户输入的情况

    • 使用(Use After Free的)X,可能覆盖P
    • 然后X-0xC的内容将改变
      • 也就是说,X-0xC可以被改为指向GOT

    img

  • X-0xC的指向(=*(X-0xC)),存在保存用户输入的情况

    • 信任X-0xC并且写入数据
    • 能够进行GOT overwrite

    img

  • 这种方法是Shellphish战队子大会结束后公开的技术

  • 事实上,也存在更容易理解的解法:

    • 大会结束后,PPP战队在IRC频道中公开的技术非常好

    • 14:52 (ricky) Here are most of my solutions: https://rzhou.org/~ricky/hitcon2014/
      14:53 (ricky) Curious as to what others did
      14:53 (tomcr00se) i don't understand your stkof
      14:54 (tomcr00se) how did you link in 0x602100 without throwing one of 10 million asserts
      14:55 (ricky) I used the fastbins - the only check is that the size matches the fastbin (and the size is the index for the next entry)
      14:55 (ricky) So I made enough entries to make the index correct 14:55 (ricky) Now I'm really curious about how you did it