首页
社区
课程
招聘
[原创]看雪.京东 2018CTF 第十四题 PWN-mine sweeping Writeup
发表于: 2018-7-14 00:33 3218

[原创]看雪.京东 2018CTF 第十四题 PWN-mine sweeping Writeup

2018-7-14 00:33
3218

#看雪.京东 2018CTF 第十四题 PWN-mine sweeping Writeup

此题是一个堆利用题,漏洞点是一个UAF,还用到了consolidate相关的知识。

程序实现了经典8*8扫雷游戏。程序功能代码不作过多分析(解题不需要玩游戏),网上有扫雷游戏的逆向分析及自动扫雷功能实现,可以参考理解。

程序功能菜单如下:

主功能菜单有两个:一是开始扫雷游戏(即使游戏局结束,因为UAF的存在,可以继续上一局);二是feed。

扫雷游戏里有三个命令可供选择:

探雷后面需要输入坐标及操作,形式 x,y,z,坐标范围1-8,z取舍0-3。其中0表示标记无雷,1表示 有雷,2,3打印当前雷盘情况,区别在于2打开记步功能,3关闭记步功能。每次探雷操作后都会检查是否胜利;如果标记胜利的变量置位则要求输入名字;根据全局变量flag决定累不累加步数。

漏洞点在out功能中:

虽然free了三个chunk,但是没有删除指针,出现悬挂指针,导致UAF。本来如果仅仅如此是没有办法利用的。因为初始化flag已经清除,再进游戏就要重新开局。
但是作者给我们在feed中留了突破口。

此处功能就是可以申请一个随意大小的chunk并写入内容,再free掉。那就可以利用这个功能改写初始化flag,让UAF真实实现。

题中共有两个大的结构体,一是游戏局数据,一个是用户排雷数据的。
游戏局数据的结构大致为:

用户排雷数据的结构大致为:

用户排雷数据实际上是8组chunk指针,表示8行,每行有16字节数据,间隔放置8列用户排雷数据和真实check数据。

UAF利用的chunk就是有着游戏局数据的chunk,此结构中的name指针可以任意写,可以通过此办法写__malloc_hook的内容为one gadget的地址,进而get shell。改写此chunk内容时只要注意置位初始化flag和表示胜利的flag就行。

而leak地址,似乎只能从唯一有打印变量功能的函数入手,就是打印当前排雷局势的。
游戏开局后的堆布局是这样的:

这里有6个chunk,chunk1就是UAF的利用对象;chunk6保存的就是8行打印数据的指针。
进入游戏后,先out利用feed修改name的指针低字节为e8,然后写name,改chunk5的size。
此时再feed一个大尺寸的chunk,fastbin就会consolidate。

然后feed出chunk4,修改chunk6的数据第一个字节为40就可以leak出堆的地址,再修改chunk6的你们两字节使其指向chunk4的数据段,leak出bin地址,得到libc基址,然后使name指向__malloc_hook并修改其值为one gadget地址,再feed就get shell了。

 

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

最后于 2018-7-14 00:34 被poyoten编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//