介绍
国赛2019的一道题,不难,但是我们三个pwn手一个都没做出来,尴尬。
(时隔N个月,终于恢复博客了)
分析程序
程序是一个典型的单选系统,漏洞出现在remove的时候,在free的时候没有index做检查,导致可以free bss段周围任意一个位置。
由于heap离bss段的位置并不是很远,所以在32位index的范围内还是可以够到的,这样我们就可以在堆上面伪造一个node出来,从而可以free任意地址。
保护开了Full RELRO
,所以got表不可写。
利用方式
- add读入数据的时候,结尾没有填’\x00’,所以可以造成信息泄漏。首先malloc两次fastbin,然后free掉,再次malloc出来就会带有残留的heap地址。其次malloc一个smallbin,free掉,再次malloc出来,会带有libc的地址。
- 在堆上伪造一个node,其中需要free的地址为一个已分配的node,接着利用未检查的index,使其free掉堆上伪造的node中的地址。
- 正常free掉,被伪造的那个node的地址,即可造成double free。(需绕过检查)
- 利用double free讲
__malloc_hook
改为onegadget,恶意出发double free成功getshell。(直接malloc出发不满足条件)
脚本
1 | #!/usr/bin/env python2 |