2

通过劫持线程arena实现任意地址分配 n1ctf2018_null - CH13hh

 1 week ago
source link: https://www.cnblogs.com/CH13hh/p/18173314
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

通过劫持线程arena,当堆开了一个线程之后,如果没有做好保护随之的危险也悄然而至 ❗

BUU上的n1ctf2018_null很好的说明了这个问题

题目链接:BUUCTF在线评测 (buuoj.cn)

看一下保护:

3419447-20240505101905462-430225752.png

除了pie保护剩下的保护全开了,64位ida载入看一下

3419447-20240505101949763-914446899.png

上来是一个输入密码,密码是i'm ready for challenge ,随后登录成功,创建了一个新的线程

我们进去看看

3419447-20240505102255968-1994063621.png

是一个死循环,可以看见对输入的chunk大小以及数量都是非常大的,而且程序还有一个溢出我们看一下sub_400bca

3419447-20240505102431691-702072694.png

那么可以看见当我们输入的内容比size小的时候,我们可以二次输入这次最大可以输入size的大小,原因是a2没有进行更新,那么这里有溢出点

我们再看一下它下面的函数

3419447-20240505103021098-2055465521.png

如果我们能修改此处的地址为system,而参数是/bin/sh那么我们就可以得到shell

如果我们溢出的字节足够大可以覆盖线程arena,那么我们可将fake_chunk链接到fastbin,进而分配我们想要的地址,但是arena是先mmap出来的,heap是过后才分配出来,所以我们覆盖不了线程arena,但是如果,我们把这块内存耗完会发生什么,那么系统会重新分配mmap一段内存,但是由于它后面是libc的地址,所以它会往前面找一块地址,那么我们输入的内容就可能在线程arena的前面,我们先申请这么大看看

3419447-20240505104418845-404405065.png

看一下vmmap

3419447-20240505103934752-580197040.png

我们看一下此处内容,从链表特征上来看,这是一个线程arena结构,它位于地址较低的地方

3419447-20240505104102218-1192715342.png

看看我们输入的内容的位置

3419447-20240505103908330-224679222.png

计算一下

3419447-20240505104446223-1088777241.png

那么我们加刚刚申请的这个是262个,我们再申请262个看看

3419447-20240505105550832-1835155451.png

3419447-20240505105648301-331045889.png

我们输入的数据在它前面,那么可以看见我们再利用二次输入数据是可以覆盖线程arena的

3419447-20240505105150735-1615227303.png

现在计算偏移进行覆盖

3419447-20240505105942150-1007619282.png

填充0x50个垃圾数据覆盖到线程arena,这里注意这里有个大小我们不要随意去改变,可以适当改最前面的一个字节,不然会出现一系列的问题

后面我们在把我们的fake_chunk接上去

3419447-20240505111140192-176604728.png

3419447-20240505111050966-113738091.png

那么此时我们再次申请chunk就会申请到假chunk

选择0x60201d的原因是这里可以伪造假chunk的size位

3419447-20240505111427843-1102134108.png

然后我们把0x602038的地方改成system的plt地址

3419447-20240505111517602-1929989337.png

然后申请0x60大小的chunk就可以申请到fake_chunk

3419447-20240505111646289-936429848.png

程序会把rbp-8处的位置给rdi,而且这个位置就是我们申请chunk输入的数据,随后call rax(0x602038)进而得到shell,记得补齐到0x60哦✅

3419447-20240505111809265-1650046941.png

wp:

3419447-20240505112026431-1953427770.png

__EOF__

本文作者: CH13hh 本文链接: https://www.cnblogs.com/CH13hh/p/18173314 关于博主: 评论和私信会在第一时间回复。或者直接私信我。 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK