Fastbin attack&&Double free和Unsortbin leak的综合使用
Fastbin attack&&Double free和Unsortbin leak的综合使用✅今天做一个综合标题,包罗利用Fastbin attack实现多指针指向一个地址,以及利用Unsortbin leak泄露libc基地址和修改__malloc_hook地址为one_gadget
标题是buuctf上面的一道标题,标题链接 https://buuoj.cn/challenges#babyheap_0ctf_2017
checksec看一下保护
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427174520491-1977571619.png
太绿了.....保护全开,不过对于堆标题这也狠正常
那么就64位ida载入
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427174651305-897510828.png
也是有一个菜单和一些功能函数
一个一个看
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427174727715-1217664889.png
那么第一个就是申请多大的chunk没有对其赋值
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427174840972-1661075907.png
第二个题目来了,没有对size检查,那么可以进行溢出修改到别的chunk
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427175415585-1043059333.png
第三个函数把指针什么的都置为0了,那么就没有UAF了
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427175530450-1431115395.png
第四个函数可以打印出chunk的内容
细致检查步调,发现并没有后门函数,那么现在思路是看看能不能能泄露libc,把一个函数更换成one_gadget得到shell
这里Unsortbin leak 可以泄袒露libc地址,为什么呢?
Unsortbin leak原理:✅
当只有一个unsortbin被free的时候,它的fd、bk指向一个指针,这个指针指向top chunk地址,这个指针保存在main_arena+0x58偏移处,而main_arena是libc的data段中,是全局静态变量,以是偏移也是固定的,根据这些就可以盘算出libc的基地址了
那么要想把它打印出来还不可,因为我们不能打印已经free的chunk(指针置为0了),但是因为是64位的chunk,如果要利用打印上一个chunk来打印这个chunk的内容,那也会有许多的\x00来进行截断,以是也是行不通的,那么我们可以找一个指针指向这个已经free的unsortbin,然后打印这个指针对应的chunk,题目似乎就办理了,那么该怎么做到呢?
如果我们可以利用Fastbin attack先将其加入fastbin 链中然后就有了一个指向它的指针,然后再malloc回来再将他改回原来的大小,再次free得到unsortbin,再打印刚刚指向它的chunk就得到main_arena+0x58处的地址了!
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427181245299-1174308953.png
效果如下
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427181411819-1106983501.png
可以看见chunk2乐成指向chunk4
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427181445224-961553461.png
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427181542555-1018598781.png
这个时候我们改变它的size为0x21因为malloc fastbin 有检查, chunksize 必须与相应的 fastbin_index 匹配,以是我们覆盖 chunk 4 的 size 为 fastbin 大小来通过检查
效果如下
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427181722803-1218860722.png
chunk4变成了fastbin
再次malloc两个大小为0x10的chunk将这两个chunk2和chunk4拿出来,然后再进行修改chunk size大小为0x91再次申请0x80大小chunk(申请到chunk4)然后再次进行free得到unsortbin
那么就可以得到libc基地址,和one_gadget地址
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427182355037-1772084393.png
效果如下
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427182305122-1969285019.png
之后我们申请0x60大小chunk将unsortbin进行分割,使其进入fastbin,然后伪造距离__malloc_hook较近的假的chunk来修改__malloc_hook,这个地方一般取__malloc_hook-35这个地方的size比较大而且再fastbin范围内(我当地是0x74)
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427182928397-1770787511.png
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427183035378-1060726419.png
我们再次修改fd指针
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427183350913-1995393757.png
效果如下
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427183438115-884259388.png
再次申请两个大小为0x60的chunk即可申请到我们设置的fakechunk然后修改__malloc_hook为one_gadget就好了,值得注意的是,找的的one_gadget可以有一点点差别,因为libc分为不同的小版本,不同的版本有区别,我们可以把找到的one_gadget加0x10或者减去0x10再试试
最后看看我们做的所有工作
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427181150604-1092057207.png
总的来说这题的难度还是不小的,很必要综合能力
最后完整wp
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427191352215-54772389.png
https://img2024.cnblogs.com/blog/3419447/202404/3419447-20240427191436903-400928670.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]