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-94y:
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,