空指针平台的第一次pwn公开赛,很高兴拿到了邀请码
漏洞点
程序的read_n函数没有截断,可以用于泄露:
1 | __int64 __fastcall read_n(char *a1, int len) |
add_file函数里对file idx的检查有误:
1 | printf("file idx:", idx); |
程序按理说应该最多只能new 20个file,但是这里对file idx的检查却是 idxa > 20,所以我们可以把folder[0]也当作file添加进另一个folder里,然后这里会导致folder[0]被free,具体原因还不是很清楚(调试得知的)。
赛后看了官方的wp,folder和file对象均会记录其指针被引用的次数,如果引用次数减为0就会被释放,上述把folder[0]添加到另外一个folder里的操作会导致folder[0]的引用计数被减为0而被释放掉,导致UAF
整体思路:
- 先泄露libc地址
- 把
folder[0]free,在用new_file函数把它申请回来,以便后续利用 - 在把0xb0大小的
tcache填满,把folder[0]free进unsorted bin - 在用
new_file函数申请一个0x68大小的file,对unsorted bin进行切割 - 在把0x70大小的
tcache填满,接着就可以fastbin dup了 - 把其中一块
fastbin的fd改成__free_hook,后续对tcache的分配会把fastbin都链进tcache中,修改__free_hook为system即可
远程环境是libc2.31的,不过也没啥大问题就是了,自己编译一个,在换一换偏移就行
exp:
1 | from pwn import * |
最后吐槽下联通的网在乡下好差,这个payload一分钟内打不完,后来换成电信的网,几下就解决了