type
status
date
slug
summary
tags
category
icon
password
当时这个题目是 0 解了的。这是我第一次做堆相关的题目,当时比赛的时候不给网络,也没有事先准备什么材料,所以比赛的时候一点思路也没有。比赛结束之后参考了一下网上的一些资料问了一下 Lotus ✌ 也算是复现出来了。
libc
版本问题解决
题目给的
libc
版本为 libc-2.23.so
,调试发现直接运行根本不会使用这个版本的 libc
,知道可以 patch 解决,但是感觉胖爷应该有更好的方法,遂去问 Lotus ✌废物小高:咋让程序用他附件里给的 libc 版本啊废物小高:[不知所措.gif]Lotus ✌ : patchelf
还是 patch 一下吧,从网上找了一篇相关的文章,跟着做了一下
主要就是下面两句
再运行,发现已经用上
libc-2.23.so
了,解决。本部分主要参考:
利用
题目的名字是
free
,附件的名字是 double_free
,不难让人想到题目利用的主要漏洞是 double free
。从网上找了一些相关的材料,结合自己逆向分析的结果,最初确定思路大概就是- 利用unsorted bin 的特性泄露
libc
基地址
- 利用 double free 实现
UAF
然后控制fd
指针到__malloc_hook
最终实现修改__malloc_hook
为one_gadget
利用 unsorted bin 的特性泄露 libc
基地址
unsorted bin
在管理时为循环双向链表,在该链表中必有一个节点(不准确的说,是尾节点,这个就意会一下把,毕竟循环链表实际上没有头尾)的 fd
指针会指向 main_arena
结构体内部。可以通过
UAF
泄露 fd
指针,拿到一个与 main_arena
有固定偏移的地址,而main_arena
是 libc
中的一个全局变量,它相对于libc
基地址的偏移量是固定的可以通过调试得到,以获取libc
基地址。所以,偏移量 offset = 0x7ffff7dd1b78 - 0x7ffff7a0d000 = 3951480
泄露过程如下:
完整代码见后文
double free
fastbin double free 是指 fastbin 的 chunk 可以被多次释放,因此可以在 fastbin 链表中存在多次,这样导致的后果是多次分配可以从 fastbin 链表中取出同一个堆块,相当于多个指针指向同一个堆块。
所以,当我们执行如下操作后,chunk#2 就会在 fastbin 中出现两次
也就是上面的
0x5565b2328000
,此时我们就可以通过 alloc(0x60, p64(evil_chunk)) # 4
,设置 0x5565b2328000
地址这个 chunk
的 fd
为指定地址。比如下图中,就是设置成了
0x7f9f2e9bbaed
只要控制
fd
的值指向 __malloc_hook
地址的前面一点,就可以实现对 __malloc_hook
的控制为了满足chunk 的 size 字段,这里需要取
&__malloc_hook - 0x23
此时,size 字段为
0x7f
刚好可以过这个检查使用工具查找
libc
中的 one_gadget所以利用方法为
此时,
__malloc_hook
指向 one_gadget
,如果顺利的话,下次 malloc
就会触发 one_gadget
进而实现 get_shell
。但是事与愿违,试了所有的 one_gadget
发现都不符合条件,害。本部分主要参考:
利用 realloc 调整栈使one_gadget生效
一番搜索无果后,继续选择问 Lotus ✌,
废物小高:找到的one_gadget 都不行,这种情况咋搞废物小高:[不知所措.gif]Lotus ✌ : 用 realloc_hook 调一下,https://blog.csdn.net/Invin_cible/article/details/123042819?spm=1001.2014.3001.5501
文章看了一下,个人理解就是把
__malloc_hook
的值设置为 realloc + ofsset
,然后 malloc
的时候就会触发 realloc
,并利用 offset
对 rsp
的值进行调整,再把 __realloc_hook
的值设置为 one_gadget
,这样在 realloc
触发后就会继续触发 one_gadget
。通过前面的查看可以得知,__realloc_hook
就在 __malloc_hook
前面紧挨着。看 一下 realloc
函数的内容,发现和 Lotus ✌ 博客里的一样那就一个个试一下,看看栈,发现当 offset 为
0xc
的时候,此时 [rsp + 30] == null
存在满足条件的 one_gadget
所以,完整脚本如下: