逆向每日一题0x04:Mine
逆向每日一练,题目地址:攻防世界 (xctf.org.cn)
- 题目来源:XSCTF联合招新赛(初赛)
- 题目描述:运气怎么这么差
- 难度:2
解题分析
这是个有意思的题,题解很多样化,这里给出一个爆破解法
题目名叫Mine,内容如其名,就是扫雷
每次输入一个坐标,可以点开对应位置的内容,可以通过扫雷知识正面攻克
用IDA打开,大概浏览了一下main函数,发现了rand函数和srand函数的调用,说明这里游戏地图是随机生成的,所以大概率不会根据输入的点位来解密或者生成flag
可以猜测,这里的flag是固定的一个值,在完成游戏之后会显示出来
通常扫雷游戏的完成游戏判定就是,当前扫开的格子数是否等于没有雷的格子数,碰巧又在IDA里发现有个变量是有符号的:mine_sum
应该就是雷的总数
综上,这里的思路就是,程序里应该有一段cmp +jcc的组合,这里cmp的其中一个值的来源会用到0x64(游戏总共100格),或者mine_sum这个变量
往下翻一番,很轻松就找到了这样的逻辑:
就像暴力破解简单的共享软件验证逻辑一样,找到关键跳转,修改即可
把这个jnz修改为jz,程序继续执行就会走游戏完成之后的语句,生成了一个字符串:
这显然不是flag,应该是某种加密或编码过的结果,通常是base编码,这里没有出现=
,I
,0
这样的字符,说明不是base64,经过测试,是base58,解密可得flag:
flag{h4pp4-M1n3-G4m3}