首页
社区
课程
招聘
[原创]Tcache利用总结
发表于: 2019-2-28 08:42 17417

[原创]Tcache利用总结

2019-2-28 08:42
17417

花时间学习了一下tcache的一些东西,现在来写一写关于这个机制的总结。

一道关于tcache的利用题,也是之前打LCTF的第一题,现在来看一看。

试试程序发现是常规的堆题。

来看看伪代码:

漏洞主要就出在创建堆函数中,存在一个null-byte-one漏洞:

一般情况下,遇到null-byte-one我们都会选择用overlapping。但是这里所分配的堆块是固定0x100大小的,不能更改,所以说我们无法构造出我们想要的堆块来利用overlapping,那么我们换种思路,既然这里选择的是最新版用上tcache机制的libc,那么我们便来利用上他的一些机制。利用unsort bin来构造攻击,首先先分配满十个堆块:

然后delete掉十个,七个进cache,三个进unseat bin当中,这里delete需要交错delete,方便实现之后的unlink:

然后我们再分配掉七个tcache bin,分配前两个unsort bin并且其中一个用上null-byte-one漏洞,此时的堆块情况就是这样的:

这里需要注意的一个点就是,当分配第一个unsort bin中的堆块时,会将unsort bin中的堆块放到tcache当中去,所以后面需要将tcache填满时只需填上6个即可。

然后再利用null-byte-one实现unlink。

这样我们可以泄漏出libc地址,而且有两个指针指向同一个堆块,可以free掉两次,实现tcache dup。

因为程序开了Full RELRO,所以这里就修改__free_hookone_gadget来getshell。

这也是一道常规题,看一下伪代码可以发现也是只有一个null-byte-one漏洞:

这里size在范围内是由自己选择的,所以说比上面那一题简单一些,跟上面那一题的思路一样,利用unlink来解决问题,首先构造一个大于0x408的堆块来避免tcache机制,再构造一个在tcache机制中的chunk,再构造一个大于0x408的chunk来避免tcache,以此unlink的时候可以不被tcache影响,此时:

这时候的堆块情况为:

利用null-byte-one将0x601变为0x600以此来unlink:

unlink后得到了一个0xb81的chunk,包括了以上三个chunk,但是其中chunk2还是有指针的,所以就能够堆块重用,使得两个指针指向chunk2,先malloc一个0x508的chunk,此时就可以leak出libc地址:

此时原本的chunk2变成了:

所以在此malloc一个0x68大小的chunk2,就可以实现cache dup,之后就常规操作了,改变malloc地址为one_gadget的地址,实现getshell:

比较标志性的一道tcache利用题,参杂了IO_FILE的利用。

保护全开:

整个程序只有createdelete,没有显示函数。

create函数中就存在一个null-byte-one漏洞,且chunk size可自行指定。delete中没有问题。

没有显示函数的时候需要用到IO_FILE的一种方法去泄漏libc地址。就是修改stdout文件流中的__IO_write_base达到泄漏目的。具体看后面。

既然有了null-byte-one漏洞,那么很容易想到用Overlapping。这里我也不多叙述了,具体的跟上面所提到的大同小异,也可以说是一样的,我着重介绍一下如何泄漏libc这一块。我们先利用前面的tcache dup_IO_2_1_stdout上创建一个chunk,此时的_IO_2_1_stdout情况是这样的:

0x7ff17c2fa780处是_IO_write_base,也就是打印函数所打印的起始地址。我们将它改为我们所要构造的打印地址泄漏libc即可。我选择将它的最低位覆盖为\x90,这时候的情况:

所以可以泄漏出libc。但是这里还有一个重要的点就是需要更改0x7ff17c2fa760处的_flag的值。为什么呢?puts函数会调用_IO_file_xsputn函数:

然后会调用_IO_new_file_overflow

然后调用_IO_do_write

最后调用到_IO_SYSWRITE则是我们的最终目标,所以这中间我们需要过掉比较多的槛。

默认的魔数是0xfbad0000。我们需要设置:

所以这里我们设置flags为0xfbad1800。当我们成功修改的时候:

可以看见修改了。接下来就可以愉快的泄漏libc了。后面就是常规的tcache dup修改free_hook操作了,自己可以尝试一下。

现在的tcache题目基本都给了null-byte-one的漏洞,一般都用overlapping来构造两个指针指向同一块来利用,有的会限制chunk size,那么就利用unsortbin来构造overlapping,有的限制了show函数功能,那么就利用IO_FILE修改_IO_write_base来泄漏,学会活灵活用。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (5)
雪    币: 351
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
2019-2-28 09:14
0
雪    币: 61
活跃值: (2390)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
3
总结到位
2019-3-2 23:20
0
雪    币: 3567
活跃值: (467)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
4
iddm 总结到位[em_87]
大半夜的不睡觉
2019-3-3 08:56
0
雪    币: 1057
活跃值: (86)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
5
您好,关于Tcache的题目,请问如何利用gdb辅助进行debug?我用docker试了试,发现似乎因为libc太新导致好多依赖无法安装
2019-8-8 16:56
0
雪    币: 3567
活跃值: (467)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
DayJun 您好,关于Tcache的题目,请问如何利用gdb辅助进行debug?我用docker试了试,发现似乎因为libc太新导致好多依赖无法安装
你是说什么依赖
2019-8-12 11:11
0
游客
登录 | 注册 方可回帖
返回
//