PWN堆unsorted_bin_attack1
- 趁热打铁,刚刚学完unlink机制,再会过头来看长城杯的一题模版堆题就感觉很容易,利用的就是
UAF漏洞泄露libc地址,然后再劫持malloc_hook为onegadget,然后就getshell,现在先来学习unsowrted_bin_attack之UAF泄露libc unsorted_bin_attack是对unsorted_bin这个bin的利用方式,但是这个bin的利用方式有好几种,所以就先从最简单的一种开始学习- 这种
unsorted_bin_attack的利用方式要与其他攻击联系起来才可以发挥作用,单单泄露libc地址有的题目用处可能不大,这个算是一个比较小的技巧,可以结合其他利用方式进行利用。
堆再介绍
- 当我们申请一个比较大的堆块时,该堆块被
free后不会被放入fast_bin中,而是被放入unsorted_bin,而unsorted_bin位于glibc中的main_arena中的bins这个地方即main_arena+88。


main_arena的结构大致如下:

unsorted_bin链表管理方式:在unsorted_bins中,这个链表的管理方式为双向循环链表,并且unsorted_bin也是用于fd、bk指针的,就像下图

- 所以
unsorted被管理的堆块就像下图这样(这里就不像unlink那样标明高低地址了):

示例程序
- 实验环境:Docker,ubuntu16.04,工具gcc,glibc2.23,pwngdb
实验1
- 实验程序:
1 |
|
分析1
- 编译好后使用
gdb进行动态调试,使用ni命令将程序运行到第二个malloc之后,free之前,使用heap -v查看堆块 - 发现我们申请了俩个堆块,都是
0x110大小的堆块,这个大小的堆块free之后是会被放入


- 然后再使用
ni指令,将程序运行到free之后printf之前,我们发现在free之后被free的堆块被放入了unsortedbin中,然后他的fd、bk指针都指向unsorted_bin这个地方

- 再使用
p main_arena命令查看一下对应的unsorted_bin中的地址,unsorted_bin的fd、bk指针也都指向被free的堆块

- 然后我们再使用
ni指令,将程序运行到printf之后,查看一下输出了什么,发现是输出了fd指针的值,即unsored_bin的地址


- 现在
unosrted_bin的地址知道了,即main_arena+88的地址知道了,该地址在glibc中的偏移了,但是main_arena在glibc的偏移不好找,而通过动态调试我们会发现,main_arena-0x10这个地址刚好是malloc_hook的地址,所以我们通过malloc_hook的偏移,去找到从而得到glibc的基地址。
总结1
- 在堆块中如果有
UAF漏洞,这样我们就可以先申请一个堆块chunk0(要保证堆块free后被放入unsorted_bin),再将chunk0释放掉 - 这时
chunk0的fd、bk指针更新指向unsorted_bin,我们再使用一个show函数那么不就可以泄露main_arena的地址即泄露libc地址了
level_1_unsorted_bin_leak
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!

