题目链接:https://www.xuenixiang.com/ctfexercise-competition-417.html
感觉自己还是太菜了,一道简单的tcache我竟然想了两天。。。
典型的菜单的形式,乍一看好像很复杂,因为给的选项很多,但是其实真正用到的仍然只有create,delete,edit,print(增删改查)
全国大学生信息安全大赛2019_pwn_babytcache(ciscn_2019_n_2)
整体的思路:只用到了一个tcache的double free,本身并不难,但是我在理解题目意思上走了很多弯路,尤其是里面指针的操作,做到一大半才发现理解错了。。。
注意chunklist[]这个数组,它在bss段上,chunklist[2*idx]保存的是堆内存的指针,chunklist[2*idx+1]的相当于一个flag,释放堆内存时 flag就置为1,但是存指针的位置没有清空,而且在deleteUser中并不检测flag,这就存在一个doublefree的漏洞。
如下图,释放之后没有置空,只是在chunklist[2*idx+1]的位置上置零
全国大学生信息安全大赛2019_pwn_babytcache(ciscn_2019_n_2)
看一下保护:
全国大学生信息安全大赛2019_pwn_babytcache(ciscn_2019_n_2)
不能改got表,所以就该改bss段上管理指针的区域。
之后主要就是在bss段上的chunklist做文章。
先构造一个double free把堆分配到chunklist[0]的位置,然后修改里面的指针,就可以实现任意地址写。注意doublefree之后,0x20大小的tcachebin就已经被破坏掉了,之后也不能再去申请。
之后就是把__free_hook改写为system的地址,然后在bss段上伪造的chunk里填入'/bin/sh\x00',之后free这块内存即可
flag{65a4fa78-c453-4de6-b9da-b1b066a99739}
全国大学生信息安全大赛2019_pwn_babytcache(ciscn_2019_n_2)
|