下载附件,解压,查壳,发现无壳,拖进IDA,shift+F12查找字符串,发现了一些奇怪的东西
但是实际上flag并不能再文件中直接找到,要经过一定的过程,实际上{*11110100001010000101111#}并不是flag
发现字符串中出现了四个很莫名其妙的单词,up,down,left,right,觉得可能时某种东西的移动方式,点击跟进调查,F5查看伪代码
发现底下的代码把我们输入的v5经过了很多的判断,最后却是通过判断v7里储存的某个数据来输出我们得到的是正确还是错误的flag,感觉很奇怪,就觉得v7应该和v3有某种关系
再去观察判断程序结束的伪代码,发现它会判断我们输入的值,如果不等于1234中的,或者某些奇怪的东西,程序会直接结束,再根据前面的上下左右的动作指令,感觉有可能是一种数组的迷宫,而且下面判断v7的值,两个ASCII码对应的字符分别是1和#,更坚定了我判断这是一个数组迷宫的想法
确定是一个数组迷宫后,再去看前面的for循环语句,发现前面的循环语句就是去确认你当前所在位置和发出移动指令后所移动到的位置,1234分别对应着上下左右这四中移动方式,那么地图本体就是v3而且根据下面的代码判断地图为5X5格式的,碰到1就结束程序,碰到#就结束,而且不能超出这个迷宫数组的范围,意味着我们只能走0这里,v7则为记录当前我们所在的位置,可得地图
所以根据上面得出的信息和判断可知flag
即:flag{222441144222}
PS:
实际上我曾经尝试过把题目的伪代码用c语言编写出来,但是超出界限就退出和找到#结束这里我弄不出来,有点问题,代码如下,懂问题在哪的大哥如果感兴趣可以告诉我问题在哪
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char v3[26] = "*11110100001010000101111#"; // 存储地图信息的字符串
int v4 = 0; // 右移偏移量
int v5, i; // 用户输入的操作选项,循环计数器
char v7[12] = {0}; // 存储迷宫地图
while (1) {
// 打印操作选项
puts("you can choose one action to execute");
puts("1 up");
puts("2 down");
puts("3 left");
printf("4 right:\n");
printf("please input your action:");
scanf("%d", &v5); // 获取用户输入的操作选项
// 根据用户输入的操作选项进行相应操作
if (v5 == 2) {
++v3[25]; // 向下移动
} else if (v5 > 2) {
if (v5 == 3) {
--v4; // 向左移动
} else {
if (v5 != 4)
exit(1); // 非法操作,退出程序
++v4; // 向右移动
}
} else {
if (v5 != 1)
exit(1); // 非法操作,退出程序
--v3[25]; // 向上移动
}
// 检查移动后的位置是否越界
for (i = 0; i <= 1; ++i) {
if (v3[4 * i + 25] >= 5)
exit(1); // 位置越界,退出程序
}
// 检查当前位置对应的地图元素是否为 '1',如果是则退出程序
if (v7[5 * v3[25] - 41 + v4] == '1')
exit(1);
// 检查当前位置对应的地图元素是否为 '#',如果是则输出提示信息并退出程序
if (v7[5 * v3[25] - 41 + v4] == '#') {
puts("\nCongratulations! You have reached the destination!");
exit(0);
}
}
return 0;
}