gyctf_2020_force
这个题目是一个新的知识点,house_of_force,第一次看,以前没见过。
HOUSE_OF_FORCE:
使用条件:
- 能够使用溢出等手段,修改top_chunk的大小
- 能够自由分配chunk大小,不会被限制
基本原理:
在malloc之中,会有一个topchunk的size大小,如果说,能够malloc一个chunk的大小大于topchunk的大小(一般是0x20df1这种个大小),那么chunk就会去到vmmap映射出来的另一端地址,一般来说会在libc上面一点点。因此可以做到修改完地址之后就能泄露出libc基地址了。这之后,可以修改top_chunk的size为:-1,因为-1在计算机中储存的形式为0xfffffffffffffffffff,所以top_chunk识别出来他的size就会变得很大。然后就可以利用很大的size,使得chunk能到自己想要的地址附近,比如说可以从0x56xxxxxxx一直到0x7fxxxxxx,这样的话,就能做到不修改got表,或者说plt表,而是修改其他的,比如说_ _malloc_hook,或者说__free_hook这些东西,修改为one_gadget或者其他函数,总是还是很好用的。
函数分析:
main:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
add():
这东西没有限制size的大小,然后buf的read固定为0x50,所以可以找到有一个堆溢出的漏洞,很明显
puts():
基本没用,所以可以忽略掉
思路分析:
这个题一开始不知道有house_of_force,所以看这个题,只有add有用,所以说学到的知识基本没有用,比如说unlink,uaf,都要free或者edit函数,这里都没有,所以卡了一万年。知道了有这个漏洞之后,这个题好像就变得简单了。
首先,需要有malloc一个很大的size,泄露到libc附近的位置,然后得到libc的基地址。这之后,使用堆溢出,修改top-chunk的size为-1(很大),然后求到_ malloc_hook和heap地址的offset,接下来add(这个offset的size,就能让chunk到达 __malloc_hook的上面),然后就add想要的地址,就可以修改出 _ malloc_hook的位置,但是这个地方,有一点问题?为什么说这里直接把 _ _malloc_hook改成one_gadget不能直接实现,必须要给个realloc的hook,然后把one_gadget写到realloc_hook的位置里面,才能执行。
原因如下,一般来说,需要满足[rsp+0x30] == NULL(或者说其他偏移都行),但是这个地方如果直接是malloc就是没有满足条件,所以说,就需要用realloc来做一次中转,以此来满足one_gadget的条件,也就是先把_ _malloc_hook改成realloc,然后在realloc中写入one_gadget就能满足条件。
当向malloc_hook写one_gadget时,如果不满足one_gadget的条件时,而我们的环境不太好调整,所以无法getshell。
我们可以通过malloc_hook和realloc_hook相配合的方法来使得one_gadget生效。