首页
社区
课程
招聘
[原创]看雪.京东 2018CTF 第十四题 PWN-mine sweeping
发表于: 2018-7-12 22:39 3146

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

2018-7-12 22:39
3146

又是保护全开的堆考题。

程序主体是个扫雷游戏,8x8的棋盘,30个雷,如下图:

图片描述

这里判断了是否在游戏中,如果在游戏中就不再进行初始化。

游戏逻辑稍显复杂,但比较关键的是赢了游戏之后的留名功能,如下图:

图片描述

如果能够控制name指针,即可做任意地址写。

于是想办法泄漏libc。想要输出东西,必须走打印棋盘的逻辑。注意到输出的时候是间隔输出的,如下图。所以想要完整泄漏还必须控制这个棋盘信息字符串数组中的指针,让程序可以错位泄露。

图片描述

回到程序开头,还有一个反馈BUG功能,可以自由malloc。而游戏还有另一个关键点,退出游戏时会free几个东西:

图片描述

game_info结构体的大小是0x40,另外两个是0x50。

那么通过反馈BUG功能即可控制game_inf,这样可以对name指针做部分写,从而达到泄漏的目的;还可以触发consolidate合并0x50的块,从而得到libc。

总结一下就是,进出游戏一次,触发consolidate来获得libc指针,然后反复控制0x40的块,对name指针做低字节写入,让name指向表示棋盘的指针数组,通过留名功能即可修改字符串指针,两次低字节修改,做错位泄漏。泄漏libc之后就随便玩了,这里把name写成free_hook,再留名即可改成system。

完整利用脚本如下:

有个小问题是由于堆排布的问题,让name指向指针数组需要低字节写入两个byte,需要撞其中的4bit,成功率1/16。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//