selph
selph
发布于 2022-11-15 / 461 阅读
0
0

逆向每日一题0x04:Mine

逆向每日一练,题目地址:攻防世界 (xctf.org.cn)

  • 题目来源:XSCTF联合招新赛(初赛)
  • 题目描述:运气怎么这么差
  • 难度:2

解题分析

这是个有意思的题,题解很多样化,这里给出一个爆破解法

题目名叫Mine,内容如其名,就是扫雷

image

每次输入一个坐标,可以点开对应位置的内容,可以通过扫雷知识正面攻克

用IDA打开,大概浏览了一下main函数,发现了rand函数和srand函数的调用,说明这里游戏地图是随机生成的,所以大概率不会根据输入的点位来解密或者生成flag

可以猜测,这里的flag是固定的一个值,在完成游戏之后会显示出来

通常扫雷游戏的完成游戏判定就是,当前扫开的格子数是否等于没有雷的格子数,碰巧又在IDA里发现有个变量是有符号的:mine_sum​应该就是雷的总数

综上,这里的思路就是,程序里应该有一段cmp +jcc的组合,这里cmp的其中一个值的来源会用到0x64(游戏总共100格),或者mine_sum这个变量

往下翻一番,很轻松就找到了这样的逻辑:

image

就像暴力破解简单的共享软件验证逻辑一样,找到关键跳转,修改即可

把这个jnz修改为jz,程序继续执行就会走游戏完成之后的语句,生成了一个字符串:

image

这显然不是flag,应该是某种加密或编码过的结果,通常是base编码,这里没有出现=​,I​,0​这样的字符,说明不是base64,经过测试,是base58,解密可得flag:

flag{h4pp4-M1n3-G4m3}


评论