Skip to main content

HGAME Elden Ring Ⅱ WP

在写出这道题之前,我还是一个对堆一无所知的小白,能做出这道题也是比较幸运,因为这道题难度不大

这道题有四个功能,add,delete,edit,put,都是对堆进行处理,最多add 16个堆,并且在free之后没有进行置NULL,并且还有对其中内容完全的把控,并且还能写0xff的数据,如此多的条件,可见这道题目并没有很难,但对于堆小白的我来说,却是难如登天

大思路主要是,泄露地址,控制程序流程。我只在栈溢出中干过这些,但是堆也是可以的

首先,泄露地址:原因是main_arena(主线程的malloc_state)存在于libc之中,并且有些bin是双向链表,也就是说有的chunk被free之后会有指针指向libc中的地址,如果此时还能将这段部分看作是user data的话,并且还能够打印出user data的话,就能泄露出地址,并且由于main_arena在libc中的偏移确定,从而可以达到泄露整个地址的目的

其次,控制程序流程,使用的方式是tcache poisoning,首先要知道tcache是线程独立的一个bin,大小最大可以大过fastbin,并且优先级也比较高,在bin中是单链表,每个链表最多7个元素,大小相同,但是由于这道题目有UAF漏洞,我可以随意的更改tcache chunk中的next指针,试想,假如我将其中一个改成另外的地址,这个链表在这里就会中断,并且如果这个时候使用malloc,你就会得到一个存在于任意地址的chunk!

上述只是原理,在这道题目中,泄露地址首先需要一个双向链表,是使用的unsorted bin,直接写最大0xff的数据,malloc这样的chunk共8个,再free 8个,这样就会有一个进入unsorted bin中,为啥是unsorted呢,是因为emm就是这样的没有为什么,一定大小的chunk在进入small和large之前会先停留在unsorted中,并且第二个控制程序流程是通过修改__free_hook函数,这个函数在free时被调用,为的是执行用户自己定义的函数,在libc中所以我们也可以知道他的地址,将__free_hook函数修改为system函数的地址,再通过free(“/bin/sh”)来调用system函数(其实这里我有点晕,为什么将/bin/sh\x00写到user data中再释放就能达到free(“bin/sh”)的效果)

exp如下

准备工作

泄露地址

修改hook,控制程序流程