【HITCON-Training】Lab 12 - SecretGarden

学习于2024-10-01 22:00:17 星期二

心得感想:这次真的把我整笑了,现在是10/2的晚上23点,我都不敢想象自己弄了多久(整整两天国庆的下午🤯)。

分析

10/1:很明显的UAF,但是我的电脑上有tcache,根本不懂机制,太奇怪了,明明释放了又还在堆中use状态???明天再看看吧,我不想把libc版本调低(因为很简单了已经)。
10/2:太可惜了不能用UAF,为什么呢,因为他没有给我们提供修改的功能,否则就可以通过del()函数释放content,然后用释放的两个content申请回来组装成一个chunk,此时我们还保留着有指针:
image
并且我们还不能获得libc地址(至少我不行),因为它visit的时候只会visit那些标志位没有被置0的,但是只要你del了以后它就把标志位置0了,这意味着即使你拥有/你知道他的指针没有释放,你也不能把它print出来。
然后还有tcache,我只知道用7个chunk来填满它,无奈,最后退回2.23版本......

思路

现在思路只有double free了,如果你一开始就想到没走弯路的话,这道题是不难。但是如果你一开始就感觉UAF能做出来的话,就要走弯路了...
为什么会想到用double free?因为没有释放的指针必定能做的一件事就是改写一个fd指针。但是改写别的chunk你得保证能通过最简单的size检查呀,我也不知道标准答案怎么搞出来的,有个0x60正好在free函数的上面,我只能说牛b。

过程

这代码没什么好说的,很简单,你只要进入gdb打印一下地址你就明白为什么申请0x50了(因为有个现成的0x60):
image
image
可以看到,确实符合申请0x50的时候需要的size(0x60)。
然后填充就行了,分别是free函数和puts函数,在这个frame里面add会马上运行到puts,所以我选择就覆盖个puts:
image
0x400c7b就是magic的地址,不要问为什么不开PIE,问就是不会。
不要问为什么不放system地址,问就是不会(开头讲了)。
然后在本地/home/xxxx(自己看ida或者源码)下面建一个flag文件就行了!成功!(我的flag里面写着123)
image

posted @ 2024-10-02 23:37  muyiGin  阅读(4)  评论(0编辑  收藏  举报