advanced heap exploiatior(搬运)

在学习chunk extended的是时候google到的,就果断搬运过来了
多图预警

搬运自https://www.slideshare.net/AngelBoy1/advanced-heap-exploitaion

advancede heap exploiator

环境

  • glibc-2.19
  • kernel-4.2
  • 64bit

目录

  • Fastbin corruption
  • Shrink the chunk
  • Extend the chunk

Fastbin corruption

假设程序有double free的漏洞

  • 目的
    • 我们可以利用fastin chunk改掉fd使得下下次malloc该chunk时可以取得自己想要的位置
  • 为了利用double free的楼哦对那个来改比那fee chunk中的fd,我们可以利用一些fastbin的特性达到我们的目的,但我们也必须通过一些chunk的检查

    fastbin的检查

    in free(p):

  • chunk address <-size 且alignment
  • chunk size > =MINSIZE(0X20)且为0x10的倍数
  • nextchunk-> size
    • 大于MINSIZE(0X20)
    • 小于system_mem(0x21000)
      检查属于该size的fastbin中的第一块chunk与p是否不同

in malloc(bytes):

  • 根据size大小取得index之后,到对应的fastbin中找,取出后检查该chunk的(unsigned lond)size事发后属于该fastbin
  • 但实际比较的时候是先以fastbin中第一块size取得fastbin的index,再去用这个index跟刚刚算的Index是否想用,不过这取index的方式是用unsigned in(4 byte)

fast bin

  • 一个单链表
  • chunk size<=0x80 byte
  • 不取消inuse flag
  • 依据bin中所存的chunk大小.再分为10个fastbin 分别为0x20,0x30…

LIFO

当下次malloc大小与这次free大小相同时,会从相同的bin取出,也就是会取到相同位置的chunk

fastbin layout

布局我就不多阐述了,之前的文章有写过很多次

利用

  • 我们可以利用fastbin的chunk再free的时候只检查属于该size的fastbin中的第一块chunk与p是否不同的特性来创造overlaps chunk
  • 创造一个circle的singly linked list,这样就可以达到类似UAF的效果
  • fd只要符和size是或否属于该chunk就可以通过Malloc检测,因此只要想写入的位置附近有属于该bin的size就可以让malloc分配到该位置
    • 根据bytes大小取得index后,到对应的fastbin找,取出后检查该chunk的size事发后属于该fastbin
    • 但实际比较的时候先是以fatbin中第一块size取得fastbin的index,再去比index和刚刚算的index是否相同,不过这取index的方式是哟个unsigned int(4byte),所以伪造是不用满足8byte
  • 因此没有检查alognment所以不一定要以8的倍数作为chunk的address

Shrink the chunk

前提

假设存在一个和off-by-one的漏洞

目的

创造出overlap chunk,进而更改其他chunk中的内容

方法

主要利用Unsortedbin ,small bin会Unlink做合并的特性来达到我们的目的

过程(看图食用最佳)

  1. 一开始先malloc 3 块chunk(A,B,C)到heap段,且fastbin是空的
    p1
  2. free(B)
    p2
  3. free(A)
    p3
  4. malloc(0x38)
    p4
  5. 往A中写数据触发off-by-one来覆盖size
    p5
  6. malloc(0x80)
    p6
  7. malloc(0x30)
    p7
  8. free(B)
    p8
  9. free(C)
    p9
    此时会因为C是SMALL BIN的大小的缘故,所以会检测上一块是否inused
    p10
    如果上一块是freed就会根据prev_size去找上一块chunk的header做合并及unlink
    p11
    此时unsortbin村这块大的chunk,所以下次malloc会用这一块先分配给user
    p12
  10. malloc(0x260)
    p13
    此时即可任意修改D
    p14

总结

  • 如果中间overlap部分有function pointer或者是其他有用的struct可简介控制程序流程
  • 也可以配合fastbin freed chunk更改fd

extend the chunk

前提

假设存在一个off-by-one的漏洞

目的

造出overlap chunk,进而更改其他chunk中的内容

原理

跟shrink很像,但主要是加大size直接覆盖后面的chunk,只要前面的 chunk header有对上的就行

过程(配合图食用最佳)

  1. 一开始先malloc 3 块chunk 到heap段
    p1
  2. free(A)
    p1
  3. malloc(0x38)
    p1
  4. 往A中写数据以构造off-by-one
    p1
  5. free(B)
    0x1b1=0x171+0x40
    为了之后可以覆盖c(把c吃进去)
    p1
  6. 此时会根据B的size去找下一块chunk的hader
    p1
  7. 此时这块chunk会被合并到top(如果c后面是top)或者加入到unsortbin中
    p1
  8. malloc(0x1a0)
    p1
  9. 此时可以任意更改c
    p1

总结

和shrink比起来extend the chunk的限制多了一些,必须要可控off-by-one的那个byte,Shrink只要是null byte即可,相对比较常见但是也不太好发现

大总结

  • 堆的漏洞利用起来虽然会难一点,但是常常在Full mitigation的情况下都可以利用,毕竟针对heap来说相对应的保护比较少,也较难实现

  • Heap是门艺术(真的是门艺术…爆肝调试就完了


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!