白天睡觉,晚上来写道题。
这道题涉及了unsortedbins,malloc_hook,堆溢出。
heap的菜单选项常规题,做到目前为止,主要是两个思路:
先check,根据RELRO。如果为full,那么就需要malloc_hook。如果为partial,就直接更改got表就可以了。
在create函数中可以明显看出来这是个结构体
一个结构体有24个字节,前8个为标志位,中间8个size位,后8个是alloc出来的chunk的指针。
(alloc和malloc不同的是 alloc的free后会清空用户数据区)
其中a1 为基地址,我一开始还打算去找这个a1,
但是看到这个a1的初始化。
这里面buf是随机数字,所以a1搜寻未果。
fill函数中,没有根据chunk的大小来限制写入大小。所以存在着溢出漏洞。
主要思路就是,根据unsorted bin 中的fd。利用main_arean泄露libc(这个还没有查阅资料)
然后利用之前布置好的盖在小块的大块来dump出来。
接下来是漏洞利用。钩子函数详细,可以查阅这个资料
https://blog.youkuaiyun.com/qq_41453285/article/details/99315504
里面介绍的很清晰,具体思路就是,在钩子函数之前有一个为末位的一块内存区域,因为fastbin中没有对齐限制。所以我们可以修改fastbin中最后一个的fd指针,指向这里,让fastbin将它加入,然后在malloc一下,之后就可以通过溢出(具体溢出长度,上面那个资料中有详细的介绍)来修改malloc_hook 处的内容:malloc函数执行的时候会先检测__malloc_hook是否为空,如果不为空就执行__mallochook。所以这时候把malloc_hook 修改为一个one_gadget的地址(好像是存在这几个固定的地址。只需要libc的基地址加上这个偏移)
那么最后再malloc一个chunk就可以触发 one_gadget。
果然还是多做题才能多涨姿势。
但是套路应该就是这几个套路了。
难题可能在泄露libc上下难度,目前我觉得应该就是这几个套路了,后续继续学习新的漏洞利用手段。