
gyctf_2020刷题
gyctf_2020_force
分析题目
这个题目仅有add函数可用,并且会返回chunk的地址,而puts函数是没有作用的,所以这里考虑使用top chunk来泄露libc的基地址
利用方式
1、当程序申请一个足够大的chunk的时候,会调用mmap在紧挨libc上方位置申请一个chunk块,所以只需要进行一个简单的计算,就可以得到libc的基地址。
1 | add(0x200000,b'aaaa') + 0x200ff0 |
2、当申请一个chunk的时候,在已有的内存找不到合适,或者组合的内存时,会从top chunk中切割一部分,我们通过溢出修改top chunk的大小,来实现chunk覆盖,从而修改指针。
3、因为程序开启了got表的防护,所以,这里需要劫持malloc_hook为one_gadget,因为one_gadget需要一些特殊的条件,所以我们这里首先让栈帧平衡,在这里,我们使用了调用realloc前,对栈帧的一些平衡的操作,然后在使用one_gadget,所以,这样的话,我们只需要将malloc_hook的地址修改为realloc前的一部分地址,然后修改realloc_hook的地址为one_gadget,这样的话,就能成功getshell。
exp
1 | # Author by: limu |
gyctf_2020_signin
分析题目
这个题目存在后门backdoor,所以我们只需要满足条件,使ptr不等于0。
然后我们看一下使用的libc是18.04版本的,相对于16.04,其中更新了tcache机制,即我们可以利用:
1、tcache仅有7个指针储存,当我们申请7个chunk并且free后,就可以填满tcache。
2、分配fastbin中的chunk时,如果还有其他相同大小的fastbin_chunk,则把它们全部放入tcache中。
3、calloc不会分配tcache中的chunk。
利用方式
所以这个题目的利用方式也就出来了,利用calloc不会分配tcache的这个机制,伪造一个fastbin_chunk的fd,利用fastbin attche的方式,修改目标位置的内存。
1、首先申请8个chunk,然后依次释放,这时,会有一个chunk因为tcache塞满,进入了fastbin中,也就是chunk7。
2、然后我们申请chunk8,此时,这个chunk会从tcache中取出,tcache会有一个空缺的位置(申请的chunk8和chunk6的地址会是相同的)。
3、然后我们修改chunk7的fd,然后利用calloc申请一个堆的操作,认为fd指向的位置为另外一个fastbin_chunk,所以会修改fd指向fake_chunk的fd,将fd指向的chunk放入tcache中。
exp
1 | # Author by: limu |