全国大学生信息安全大赛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}
支持学逆向论坛,资源不错! 资瓷资瓷!资源丰富! 大佬发一下地址
大佬,请教一下,double free不会崩溃吗?
看到这个错误free(): double free detected in tcache 2,并且崩溃怎么解? 为什么这样就可以修改free_hook的地址为system_addr?能详细说明一下吗?
edit(2,p64(free_hook),p64(0))
edit(0,p64(system_addr),p64(0)) kone 发表于 2020-11-23 14:39
大佬,请教一下,double free不会崩溃吗?
看到这个错误free(): double free detected in tcache 2,并且 ...
libc2.27是可以直接释放两个相同的chunk来double free的,可能你的是libc2.29? 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]