一、工具
1、IDA
二、解题思路
双击进去查看关键函数实现代码
经过分析后可以判断该题是一道迷宫类题目
由第二个 while 可以知道,只要按下反向后,在该方向上只要都是 0 ,那就一直走下去,直到遇到障碍物,由循环体的判断可以知道,方向上必须有障碍物存在,否则会导致程序退出执行。
byte_201020 函数中保存的应该就是迷宫边界之类的数据,上述图片中我们已经猜测迷宫每行是16个字符(16 x 16 的正方形),接下来我们就可以写代码了(用来打印迷宫)
#include <Stdio.h>
int main(){
char data[]={
0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x23, 0x23, 0x23,
0x00, 0x00, 0x00, 0x23, 0x23, 0x00, 0x00, 0x00, 0x4F, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x4F, 0x00, 0x50, 0x50, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x4C, 0x00, 0x4F, 0x4F, 0x00, 0x4F, 0x4F, 0x00, 0x50, 0x50, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x4C, 0x00, 0x4F, 0x4F, 0x00, 0x4F, 0x4F, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x4C, 0x4C, 0x00, 0x4F, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00,
0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x4D, 0x4D, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x4D, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x45, 0x45,
0x00, 0x00, 0x00, 0x30, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x45,
0x54, 0x54, 0x54, 0x49, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
0x00, 0x54, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00,
0x00, 0x54, 0x00, 0x49, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x4D, 0x21, 0x00, 0x00, 0x00, 0x45, 0x45
};
for(int i = 0;i < 16;i++){
for(int j = 0;j < 16;j++){
if(i == 0 && j == 0){
printf("☆ ");//起点
}
else if(data[i * 16 + j] == 0){
printf("□ ");//路
}
else if(data[i * 16 + j] == 0x21){
printf("★ ");//终点
}
else{
printf("■ ");//障碍物
}
}
printf("\n");
}
return 0;
}
最终答案:
flag{MEWEMEWJMEWJM}
三、细节处分析
①、很多人不理解,为什么 +16 表示向下,-16 表示向上,原因很简单,我们上面已经分析出来了,迷宫地图是 16 x 16 的方形图
(+1 、-1 这个就不用分析了,+ 就向右,- 就向左)
②、
这一部分很多人看不懂,其实也很好理解,这个 unsigned int 表示无符号整型,你也可以理解成绝对值,v2 表示当前所在方块(以 ① 中的图为例)位置,v2(max) = 256 (16 x 16),当 v2 = 240 时,如图所示
当 v2 在大于 240 小于 256 范围内,则 - 240 是 > 0xF 的,所以 if ( v4 == 16 && (unsigned int)(v2 - 240) <= 0xF ) 的作用是表示最后一行;其他的也是差不多这样分析就可以了。