fastbins

为了高速化而实现的机制

www.valinux.co.jp/technologylibrary/document/linux/malloc0001/

bins和fastbins

  • 之前提到过libc中存在一个为了快速搜索free区域而存在的链表

  • 这是arena(malloc_state构造体)中存在的列表头

    img

  • free状态的chunk根据相似大小来管理,因此会有多个列表

    img

  • size比较小的chunk,free的时候会暂时和fastbins连接

    • 这个链表是单向的
    • 每个chunk在x86环境下是小于64字节,x86_64环境下是小于128字节
    • 也存在bk成员变量,但因为高速化,不会使用到

    img

  • 进入fastbins的小的chunk如果是像下面这样的状态,就存在堆溢出

    • 覆盖fd
    • 这就可能进行fastbins attack

    img

正常的malloc()

  • 假设有一个像这样的fastbins列表

  • 各个chunk根据size连接到fastbins列表

    • 图中也显示size,因为它很重要

    img

  • 取出fastbins的第一个元素,进行简单的检查

    • 检查P->size,判断它是否在正确的fastbins列表里

    img

    连接到fastbins的小的chunk是根据size大小决定要连接到哪个fastbins列表上

  • 之后,将其从列表中删除

    img

exploit的流程

  • 通过P2上的堆溢出覆盖fastbins上的P的fd

    • 使其指向X

    img

  • 进行malloc()的时候P被unlink

    • fastbins列表现在和X相连接

    img

  • 下次进行malloc()时,就可能返回X

    img

    • 但是X下面没有合适的size也不行
    • 因为存在判断它是否在正确的列表中

    img

  • 原本malloc()的返回值是堆的地址,通过这种方式就能够让返回X

  • 假设X是一个保存函数地址的区域(例如GOT)

    img

  • 也就可以通过对malloc()的返回值,也就是X进行特定值写入,来覆盖GOT

    img

有什么困难

  • 这不仅是对用户进程的hack,还要跟踪libc中的内容
    • fastbins感觉不太出名
  • 仅通过分析给出的二进制程序来解决它是不可能的
    • 需要了解libc.so中malloc和free的行为相关知识