unsorted bin 利用的简单总结

Posted on Apr 5, 2021

学习堆利用也有一段时间了,基本上就是在和 fastbin 和 unsorted bin 打交道,最近这段时间 tcache 的题也做了一些。套路居多,想想还是应该总结一下。不会写的太详细,也可能无法写全。

Unsorted Bin

这大概是我接触的最早的 bin

这是一个比较简单、比较模板化的利用,unlink 也可以在 small bin 上生效,但是碰到的大多都处在 unsorted bin 上,我就归结到这里了。常见于菜单题,一般都是会有一个数组存储了每一个堆块的地址的。unlink 能实现的是使一特定的指针指向其所在地址前三个机器字长处,以六十四位为例就是 ptr = &ptr - 0x18

而利用总体就是三步

  1. 想办法布置 fake_chunk,然后 free 其上面或者下面的 chunk,触发 unlink
  2. 此时获得了对堆块数组任意写的能力,在数组上写入 free@got,然后用编辑功能把 free@got 写成 puts@plt 等实现 leak。
  3. 数组上写入某些参数可控的函数的 got 表地址(一般是 atoi 系列函数),写成 system 的地址,getshell。

这就算是典型的 unlink 了,比较经典的应该是 hitcon2014_stkof,当然单单这样肯定很没意思,有一些题目会出现变种,比如 4-ReeHY-main-100 这题,开启了 full reload WP

将 fd 和 bk 都指向自己所在的堆块头也是可以通过 unlink 检测不至报错的,一般这种伪造被认为是无意义的,但是有些时候能起到奇效,比如 secret_of_my_heart 这题。

leak

这个问题我之前写过专门写过一篇文章如何利用Unsorted Bin泄露Libc基地址分析,这其实算是一个小 trick,比较常用。

先写到这里,之后再更新。