这道题是本周的任务之一,是一道迷宫题,因为是华南师大的赛题我一开始以为很难,抱着试试的心态去做,没想到并没有我想象中的难,挺简单的哈哈哈哈,但可能有一点取巧了

首先检查程序,是一个 32 位的无壳程序,然后就是丢到 ida pro 中看主函数,然后可以看到以下这部分

它的关键部分就是我圈起来的这一部分,也就是这个 check 函数,同时它有一个条件是 flag 的长度要为 24 位,也就是说走出这个迷宫的路径就是 24,现在我们先查看一下 check 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
bool __cdecl check(char *flag)
{
char *v1; // eax
int v2; // eax
char *cur; // [esp+Ch] [ebp-4h]

cur = &maze[14];
while ( *flag && *cur != 42 )
{
v1 = flag++;
v2 = *v1;
if ( v2 == 100 )
{
++cur;
}
else if ( v2 > 100 )
{
if ( v2 == 115 )
{
cur += 13;
}
else
{
if ( v2 != 119 )
return 0;
cur -= 13;
}
}
else
{
if ( v2 != 97 )
return 0;
--cur;
}
}
return *cur == 35;
}

其中有一个 maze 数组,这应该就是我们的迷宫图了,我们点进去看,可以看到迷宫的组成

虽然有了它的组成部分,但是我并不知道它的格式是什么,从 check 函数来看,因为 @是第 14 位,所以我可以知道 @就是起点,终点都不用想,肯定是 #了,那么现在问题的关键就是要知道这个迷宫的格式,他肯定是个矩阵型的,这才符合一个标准的迷宫图形

这里我想到一个办法,就是把它复制粘贴到 word 文档中,看它有多少个字符,看会不会符合一个矩阵型,然后发现它一共有 169 个字符,我就想这不就是 13 的平方吗?于是我就赶紧操作起来,把它分为了一个 13×13 的迷宫,这就是它的格式了(也是我取巧的部分吧)

弄完之后就是长这个样子

然后我就以 @为起点,# 为终点来走迷宫(注意要是最短路径),然后走出了一个长度为 24 的路径,用 WASD 来表示上下左右,点开程序输入进去,发现是对的。不过这里有一点要注意一下,就是迷宫的每一步都要对齐,不要一下子就飘到另一个地方了,我一开始因为这样而错了好几次。

最后的结果如下

所以 flag 就是:flag{sssssdsssddsdddwwdwwaaaw}