180129 逆向-ichunqiu(SimpleGame)

本文详细介绍了对一款名为ichunqiu SimpleGame的逆向分析过程,包括对程序的壳分析、输入格式检查、关键函数`assign`、`is_full`和`check`的逻辑解析。在`assign`函数中,根据特定规则将输入转换为坐标并更新地图;`check`函数确保输入值不超过已填充的最大值。通过画图和理解填充顺序,解出了游戏的解决方案,从而获取flag。
摘要由CSDN通过智能技术生成

1625-5 王子昂 总结《2018年1月29日》 【连续第486天总结】
A. ichunqiu-SimpleGame
B.
比起上题来说要复杂很多,但是代码读起来还是挺清晰的…算是中档题吧…
国赛的数独代码太乱了给我留下太深的阴影……

分析

言归正传,首先查壳,发现UPX,轻松脱掉进行反编译
这里写图片描述

通过fgets接收输入以后,首先两个格式check,之后执行三个函数要求全不返回-1

粗览一遍可以发现assign中读取输入作为坐标对某个map进行了赋值,is_full中则检查了是否含有空值即0,check则是以一个规则来遍历map

按部就班慢慢读就可以发现各个函数的逻辑

assign

首先看到一些常量

  • map 403020 大小为9x9(int)
  • 字符池 4020A0 大小为64*9(byte),即16*9(int)
  • 赋值顺序 403170 大小为18(byte)

4个字符为一组,第一、三个字符确定读取内容的转换方式和横纵坐标的先后
由代码整理逻辑如下:

x:
a : 100-n
d : n-94

y:
s : n-95
w : 99-n

例如第一个字符是a,第二个字符是b
则对应值为x = 100-ord(‘b’) = 2

顺序是固定好的,存放在403170处,dump下来得

dssdwasawawaaswddw

确定读入的坐标以后,由该坐标为起点,从4020A0处依次提取4*4个int型数据
如果提取出的是0则跳过,非0则赋值给map(403020)

上述过程重复9次,读取全部36个输入字符

4020A0处保存的是一些0和1-9的数字,map中则存放了一些0xf和0
暂且不知道有什么用处,先去看check吧

check

这里写图片描述

check函数意外的简单,只是要求遍历map,读入的值不可比之前读过的最大值大于2以上

解题

首先将dump出来的map画出来
画图代码为:

map = [15, 15, 15, 15, 15, 0, 0, 15, 15, 15, 0, 0, 0, 0, 15, 0, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, 15, 0, 0, 0, 0, 15, 15, 15, 0, 15, 0, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值