-
-
[原创]看雪.京东 2018CTF 第十四题 PWN-mine sweeping
-
发表于:
2018-7-12 22:39
3296
-
[原创]看雪.京东 2018CTF 第十四题 PWN-mine sweeping
又是保护全开的堆考题。
程序主体是个扫雷游戏,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。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课