2022祥云杯
leak
libc版本为2.27, 沙箱开了跟没开差不多。。


程序含有加密和解密的两个函数,这两个函数十分复杂,但是无需用到,其他几个简单的函数里面的功能已经足够获取到flag了。

flag已经提前读取到了一个堆块内。

释放堆块存在UAF。

可以申请十六次堆块,堆块大小十分宽松,在0x60000以内即可,写堆块直接就是read读入。

所以题目的重点在于把堆块内的 flag 打印出来即可,这题可以 IO 打印出堆块内容。通过 unsorted bin attack 改大 global_max_fast ,造成 fastbinY 数组溢出,从而释放大堆块后可以往 main_arena 后面的地址上写入堆地址,本题选择往 write_base 和 write_ptr 写入内容,最后 exit 退出刷新 IO,即可打印出 flag 。
计算申请的 size 公式为:
1 | |
还可以往 main_arena 后面的地址上写入任意的 8 位十六进制数,因为在 malloc 的时候会把 fastbinsY 的链表头部取出,并且把其 fd 位置的内容作为链表头部写入到 fastbinsY 数组中,而在这个过程中是没有对可控堆块的 fd 位置的内容的合法性做检查。
最后一个小问题就是,要写入 write_base 位置的堆块最好能距离存放 flag 堆块在 0x100 内,这样可以避免堆地址随机化 1/16。
成功打印 flag 。

1 | |
unexploitable
题目只给了一个栈溢出,没有调用任何的输出函数,保护除了canary都开了。利用vsysycall 0xffffffffff600000滑到主函数的返回地址,然后对进行 1/4096 的爆破。。。
1 | |
- 本文作者:ShouCheng
- 本文链接:http://shoucheng3.github.io/2022/11/11/2022-11-11-2022%E7%A5%A5%E4%BA%91%E6%9D%AF/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!