学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

94

积分

0

好友

1

主题
发表于 2020-9-2 00:32:43 | 查看: 8975| 回复: 7

相关题目:

♦ n-2

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

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

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

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

全国大学生信息安全大赛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)


看一下保护:

全国大学生信息安全大赛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)

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




exp.txt

2.56 KB, 下载次数: 3, 下载积分: 学币 -3

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

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
已有 1 人评分学币 理由
roger + 3 感谢您的热心分享,学逆向论坛有你更精彩!.

总评分: 学币 + 3   查看全部评分

    发表于 2020-9-2 07:07:14
    支持学逆向论坛,资源不错!

      发表于 2020-9-17 20:15:56
      资瓷资瓷!资源丰富!
      发表于 2020-10-27 16:23:48 来自手机
      大佬发一下地址
      发表于 2020-11-23 14:39:03

      大佬,请教一下,double free不会崩溃吗?
      看到这个错误free(): double free detected in tcache 2,并且崩溃怎么解?
      涅槃 发表于 2020-11-23 21:15 详情  回复
      libc2.27是可以直接释放两个相同的chunk来double free的,可能你的是libc2.29?
      发表于 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:25 详情  回复
      这个时候已经把标号为2的chunk分配到了chunk_list的地址,把chunk0的位置改成free_hook的地址,再edit chunk0,就相当于在free_hook那里任意写
      发表于 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那里任意写

      小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

      GMT+8, 2024-4-20 04:15 , Processed in 0.099356 second(s), 73 queries .

      Powered by Discuz! X3.4

      Copyright © 2001-2021, Tencent Cloud.

      快速回复 返回顶部 返回列表