[ACTF新生赛2020]Oruga
前言:争取寒假养成一天一篇的博客的习惯
ELF64,无壳,丢ida继续分析
找到了main函数,是一道输入型的题目
可以看到main函数只有一个关键的函数sub_78A,同时也把我们输入的s字符串传入了进去.
继续跟进
可以看到一开始是有WEMJ的四种情况,有点类似迷宫,但是不确定,但我们可以通过每次索引的字符来判断是否为迷宫
如果是W,则v4 == 16,
如果是E,则v4==1,
如果是M,则v4==16,
如果是J,则v4=-1
而在第二个循环可以看到最后v2+=4的,而数组里的值是通过v2进行寻值的
所以根据迷宫题,上下左右的原则,v4=1,肯定就是往右边移动1格,v4=-1,肯定就是往左边移动1格,如果是往上走的话,是v4=-16,也就是上下二个数据相差0x10,同理往下走,就算v4=16.
这是第一个循环告诉我们的意思,而第二个循环是干什么的呢?
既然我们知道了1,-1,16,-16分别代表左,右,下,上。
那么条件(v2 & 0xF) ==0 就代表如果当前位置在第一列,那么不能往左边走;
条件v2%16 == 15则代表如果当前位置在第十六列,那么就不能往右边走
条件v2-240 <= 0xF 代表如果当前位置在最后一行,那么不能往下走
条件v2+15 <=0x1E 代表如果当前位置在第一行,那么不能往上走
所以如果不满足任何以上任意一个条件,就返回0LL
然后我们用python脚本把地图大致搞出来
初始点是0,终点是!,这里终点是!的原因是因为,这里的关键函数代码不能超过33,33刚好就是字符"!"
同时我们这里碰到障碍物,也要往别的方向走,结合上述规则。
迷宫的路线如下
flag{MEWEMEWJMEWJM}