0x00 House of Orange

  由于只是个人经验记录为主的一篇博文,所以并不打算将前人已经讲得很细致的部分再重复,因此建议初学者先阅读

0x0 free without free

  本题最大特色就是功能中不提供free函数,而没有free意味着传统leak和attack方式全部失效。利用top chunk的特性来得到一个freed chunk即是orange带来的全新攻击思路。

 这种操作的原理简单来说是当前堆的 top chunk 尺寸不足以满足申请分配的大小的时候,原来的 top chunk 会被释放并被置入 unsorted bin 中

  由于题目功能中存在的堆溢出,修改top chunk size非常轻松,但是也有一些特别的约束

  • 大于MINSIZE(一般为0x10)
  • 下一个chunk申请过大(0x20000)会导致调用mmap从而不会free top chunk
  • top chunk的地址+size后要满足页(0x1000)对齐

0x1 leak with unsorted&large bin

  修改完top chunk的size位后malloc一个大于它的chunk,会发现原先的top chunk已经被free并被放入unsorted bin中,例如这样:

  • 00005625E60F3080 00 00 00 00 00 00 00 00 61 0F 00 00 00 00 00 00
  • 00005625E60F3090 78 9B 88 3A FD 7E 00 00 78 9B 88 3A FD 7E 00 00
  • 00005625E60F30A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

  借此可以leak出libc base,不过我们还需要heap base,获取起来也非常轻松,再次malloc一个在large bin范围并小于修改后的top chunk size的chunk。在malloc的分配流程中,遍历unsorted bin时由于top chunk不等于

  • 00005634B6E880C0 00 00 00 00 00 00 00 00 11 04 00 00 00 00 00 00
  • 00005634B6E880D0 64 64 64 64 64 64 64 64 88 71 80 7E A7 7F 00 00
  • 00005634B6E880E0 C0 80 E8 B6 34 56 00 00 C0 80 E8 B6 34 56 00 00