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地址了
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!
评论