1625-5 王子昂 总结《2017年12月10日》 【连续第436天总结】
A. CTF训练平台bugku-Take the maze
B.
首先运行,提示输入key
查壳显示无,拖入IDA
根据字符串定位到main函数
这里可以看出基本格式:24位十六机制
另外在字符串里可以看到很多print ticket的字样
(这个操作有点像今年国赛的“欢迎来到加基森”呢,吓了我一跳)
下面可以看出来是写入文件的操作,如果直接把这个东西dump出来不就得到flag了吗~
二进制复制下来,发现是张二维码,惊喜的扫码识别:
Congratulations! The flag is your input + “Docupa”
哦= =我就知道没这么简单
乖乖分析check函数吧
流程挺清晰的,每次读取两个输入,分别通过switch进行保存
通过数组byte_541168再次转换作为最终值
第一次输入决定函数,第二次输入则决定参数2
查看发现4个函数结构基本相同,大致如下
可以看出来,参数a2(即第二次输入)就是计数器,表示循环次数
每次循环都会对i += 26
但是注意,i只是一个局部变量,把它保存回a1上是有条件的:
i/26<=10
dword_540548[i] ^ dword_540068[i] ==0
这两个条件很明显,前者是限定范围,后者则是限定路径
限定路径的方法是要求这两个数组的对应值相同才以该方向移动
eg: 坐标为(4, 5)向下移动,则判断dword_540548[4*26+5] ^ dword_540068[4*26+5]==0,相等则合法,移动成功,不等则直接return 移动失败(i未写入a1)
同样查看另外三个函数可以得出限定范围
x∈[1, 24]
y∈[1, 10]
4个函数的数组彼此都不相同,也就是说每个坐标的可移动方向是不同的,因此要分别判断
这里刚开始卡了我很久想不通,本来以为是先改变i再校验路径合法性的
其实i+=26是在循环体结束时调用的,而结束循环的计数器校验放在循环体的开头
这也就意味着顺序其实是:校验计数器→校验当前i的路径合法性→改变i→校验计数器
改变i和校验路径合法性的先后顺序决定着到底是一个地方可以向某个方向移动
还是一个地方可以由某个方向移动来
真正的方式是前者
移动方式找到了,下一步寻找终止check,也就是终点
反编译的伪代码中没有对v7的调用,去反汇编中找到
311 = 11*26 + 25
也就是说长宽至少为12*26,从左上角移动到右下角即可
于是下一步是dump出路径
通过IDC脚本可以直接输出合法性的数组:
以一个为例:
IDC>auto i;for(i=0;i<26*12;i++){
if(Byte(0x540548+4*i)==Byte(0x540068+4*i))Message("1, ");else Message("0, ");}
1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
然后将4个方向的都dump下来以后,复制到脚本中进行处理从而生成地图
u = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,