空指针平台的第一次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一分钟内打不完,后来换成电信的网,几下就解决了