-
-
[原创]看雪.京东 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直播授课