首页
社区
课程
招聘
[原创]ctf pwn中的unsorted bin利用及chunk shrink——0ctf2018 heapstorm2 writeup
发表于: 2018-4-13 01:39 16138

[原创]ctf pwn中的unsorted bin利用及chunk shrink——0ctf2018 heapstorm2 writeup

2018-4-13 01:39
16138

https://github.com/eternalsakura/ctf_pwn/tree/master/0ctf2018/heapstorm2

利用linux的/dev/urandom文件产生较好的随机数
https://blog.csdn.net/stpeace/article/details/45829161

图片描述

图片描述

读入随机数前

读入随机数后

图片描述
图片描述
用如图上数字1处的随机数去覆盖后面的16个的每一行的左八个字节(堆指针)。用如图上数字2处的随机数去覆盖后面的16个的每一行的右八个字节(size)。
用图上数字3处的随机数去覆盖数字4处。

图片描述

图片描述

有off by null漏洞

图片描述

图片描述

图片描述

在update的时候有一个off by null。

之前做堆的题都不建结构体,全靠脑补…这次建一下,让反编译出来的好看一点。
1.添加segment
图片描述
图片描述
图片描述
图片描述
2.建结构体

图片描述
3.改函数参数
图片描述
图片描述

4.最后的修改结果
图片描述

前提:存在一个off-by-null漏洞(已满足)
目的:创造出overlap chunk,进而更改其他chunk中的内容
主要利用unsorted,small bin会unlink合并的特性来达到我们的目的。
1.伪造prev_size

图片描述
2.free 1,于是下一个chunk的inuse和prev_size将被设置。
图示灰色的地方代表被free掉,然后触发off by null,修改1的size。

图片描述
3.将free的1再分配出来,然后再分配一块空间到原来的1中,注意大小不能刚好使得这个chunk和2相邻,否则会把2的inuse位置1,不能在后续触发unlink。
然后再free 2,就能触发unlink,然后1和7,overlap

图片描述
图片描述

图片描述

当free 2的时候,因为2是small bin的大小的缘故,所以会检测上一个chunk是否inused.
它会根据prev_size找到1,然后做unlink。
此时,unsortbin存放着这块大的chunk,所以下次malloc会用这一块先分配。
图片描述

可以看出通过chunk shrink,实现了overlap。

重复一遍之前的过程,再次构造overlap

然后4和8交叠。

free 2前

free 2后

将2再分配出来,这时0x5555557575c0掉链,进入large bins中,再free 2,0x555555757060再次进入unsortedbin。

然后要fake 0x555555757060的后向指针。

fake前

fake后

可以看出bk指针被改写。
然后fake

fake前

fake后

当再分配一个chunk的时候,会先检查unsorted bin中有没有合适的,如果没有就把unsortbin中的chunk插入large bin中。
看源码

当找到插入的位置后,看源码里具体的插入操作。
注意large bin要维持两个双向链表,多了一个chunk size链表,所以要在两个链表中插入。

在此题中,fwd只可能是我们放入large bin的唯一一个chunk,而它的bk_nextsize和bk都是我们可以控制的(如上一步的改写)

victim就是我们要插入的堆地址。
bk_nextsize被写为0x13370800-0x20-0x18-5,那么*(0x13370800-0x20-0x18-5+0x20)=victim

bk被写为0x13370800-0x20+8,那么*(0x13370800 -0x20+8 ) = victim。

当第一个chunk从unsorted bin插入到large bin之后,再到unsorted bin的下一个chunk,如果不满足分配则插入到large bin中。
而下一个chunk是我们伪造的(0x13370800-0x20)

而这个地方已经有值了,也就是我们写入的
(0x13370800-0x20-0x18-5+0x20)=0x133707e3=victim

chunk的size,即0x13370800-0x20+0x8=0x133707e8,就是\x55或者\x56。

之所以要求是\x56,因为需要满足一个检查。

即chunk的mmap标志位置位。

之前我调试的时候都是打开的ASLR,现在关掉看一下,多运行几次总能有一次成功的。
图片描述
去掉标志位,那么它的大小就是0x50,就满足alloc(0x48),就会返回给我们,成功返回0x13370800-0x10之后,就是传统的做法了。

图片描述

https://gist.github.com/Jackyxty/9de01a0bdfe5fb6d0b40fe066f059fa3

https://github.com/willinin/0ctf2018/blob/master/heapstorm2/heapstorm2.md


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-2-2 14:29 被kanxue编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (1)
雪    币: 5
活跃值: (132)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
可以的老哥
2019-5-22 14:36
0
游客
登录 | 注册 方可回帖
返回
//