💧对于堆溢出,有很多漏洞可以和它打配合,可以说是堆里面很常见的漏洞,常见的有off_by_null,House系列(后续学习到了会继续更新这个系列),unlink,等等。
今天来看一个,堆溢出修改指针,导致libc泄露以及通过指针来修改got表的题目。
题目连接我放下面了,对堆有兴趣的可以去看看✔️
题目链接🔗:https://pan.baidu.com/s/1_j2gw22PQHK-PiC8HUcVvg?pwd=d2wt
提取码:d2wt
接下来分析一下题目,首先看一下保护
32位,got可以修改,其实对于堆题目,有很多都是,保护全开的,这在堆里面很常见,都是我们还是要看保护,got可以修改,那么我们可以修改free或者malloc的got表,如果不能修改got表,我们还可以考虑__free_hook和__malloc_hook
32位ida静态看一下
有一些功能函数,我们具体看一下,add函数
注意这里是申请了两个chunk,第一个大小是我们输入的,第二个是0x80固定的大小,然后我们输入的name保存到了第二个chunk,而且这里把第一个chunk的指针放到了第二个chunk的数据里面,继续看
这里对输入的chunk的判断依据大小是name chunk和我们输入数据chunk之间的距离,如果先申请一些chunk把他们隔开那么就可以实现很大的堆溢出
update函数这里也是这样判断的
delete函数,把chunk1,2都进行了free
show函数可以进行name和text的打印
❗思路:我们知道申请chunk的时候会首先到bin里面去找,如果没有在从Topchunk里面切割一块,如果申请的大小超过0x20000,那么就不是mmap分配了,释放的时候如果两块chunk物理相邻,那么会把他们进行合并,如果我们申请一个0x80大小的堆块,(chunk1,2现在都是0x80),释放的时候他们就会合并成一个0x100的chunk,如果我们再次申请那么就会申请到这里,中间再申请一个0x80大小的chunk和一个0x8的chunk(用来存放/bin/sh),那么再次申请0x100大小chunk的时候name chunk就会跑到最后面,他们之间有0x80*3+0x10大小的空间,足够我们溢出了
进行了合并
指针修改之前
修改之后
chunk1的指针换成了free_got表地址,那么打印chunk1的时候就可以进行泄露,之后修改chunk1那么就可以进行修改free_got表为system,最后free chunk2(/bin/sh)
就可以获得shell
exp:
常回家看看系列持续更新..........