涅槃 发表于 2020-9-2 00:32:43

全国大学生信息安全大赛2019_pwn_babytcache(ciscn_2019_n_2)

题目链接:https://www.xuenixiang.com/ctfexercise-competition-417.html

感觉自己还是太菜了,一道简单的tcache我竟然想了两天。。。

典型的菜单的形式,乍一看好像很复杂,因为给的选项很多,但是其实真正用到的仍然只有create,delete,edit,print(增删改查)


整体的思路:只用到了一个tcache的double free,本身并不难,但是我在理解题目意思上走了很多弯路,尤其是里面指针的操作,做到一大半才发现理解错了。。。

注意chunklist[]这个数组,它在bss段上,chunklist保存的是堆内存的指针,chunklist的相当于一个flag,释放堆内存时 flag就置为1,但是存指针的位置没有清空,而且在deleteUser中并不检测flag,这就存在一个doublefree的漏洞。
如下图,释放之后没有置空,只是在chunklist的位置上置零


看一下保护:


不能改got表,所以就该改bss段上管理指针的区域。
之后主要就是在bss段上的chunklist做文章。

先构造一个double free把堆分配到chunklist的位置,然后修改里面的指针,就可以实现任意地址写。注意doublefree之后,0x20大小的tcachebin就已经被破坏掉了,之后也不能再去申请。
之后就是把__free_hook改写为system的地址,然后在bss段上伪造的chunk里填入'/bin/sh\x00',之后free这块内存即可


flag{65a4fa78-c453-4de6-b9da-b1b066a99739}




qfnuzlr 发表于 2020-9-2 07:07:14

支持学逆向论坛,资源不错!

小马哥 发表于 2020-9-17 20:15:56

资瓷资瓷!资源丰富!

贪多了嚼不烂 发表于 2020-10-27 16:23:48

大佬发一下地址

kone 发表于 2020-11-23 14:39:03


大佬,请教一下,double free不会崩溃吗?
看到这个错误free(): double free detected in tcache 2,并且崩溃怎么解?

kone 发表于 2020-11-23 18:58:27

为什么这样就可以修改free_hook的地址为system_addr?能详细说明一下吗?

edit(2,p64(free_hook),p64(0))
edit(0,p64(system_addr),p64(0))

涅槃 发表于 2020-11-23 21:15:20

kone 发表于 2020-11-23 14:39
大佬,请教一下,double free不会崩溃吗?
看到这个错误free(): double free detected in tcache 2,并且 ...

libc2.27是可以直接释放两个相同的chunk来double free的,可能你的是libc2.29?

涅槃 发表于 2020-11-23 21:25:42

kone 发表于 2020-11-23 18:58
为什么这样就可以修改free_hook的地址为system_addr?能详细说明一下吗?

edit(2,p64(free_hook),p64(0))


这个时候已经把标号为2的chunk分配到了chunk_list的地址,把chunk0的位置改成free_hook的地址,再edit chunk0,就相当于在free_hook那里任意写
页: [1]
查看完整版本: 全国大学生信息安全大赛2019_pwn_babytcache(ciscn_2019_n_2)