首页
社区
课程
招聘
[已解决] [求助]攻防世界re maze题目中如何判断O 左移,o右移,"."上移,0下移的? 50.00雪花
发表于: 2022-4-9 22:18 5857

[已解决] [求助]攻防世界re maze题目中如何判断O 左移,o右移,"."上移,0下移的? 50.00雪花

2022-4-9 22:18
5857

最近向学习一下re方向的知识,所以找了攻防世界的re题目来做。
在做maze迷宫题目时,判断迷宫中控制前进方向的字符,花费了很长一段时间也没做出来。网络上的wp,对这部分的解释也大都模糊带过。想请教一下各位老师,这个控制前进方向的字符怎么判断的。

IDA的伪代码:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
__int64 __fastcall main(int a1, char **a2, char **a3)
{
  __int64 v3; // rbx
  int v4; // eax
  char v5; // bp
  char v6; // al
  const char *v7; // rdi
  unsigned int v9; // [rsp+0h] [rbp-28h] BYREF
  int v10[9]; // [rsp+4h] [rbp-24h] BYREF
 
  v10[0] = 0;
  v9 = 0;
  puts("Input flag:");
  scanf("%s", &s1);
  if ( strlen(&s1) != 24 || strncmp(&s1, "nctf{", 5uLL) || *(&byte_6010BF + 24) != 125 )
  {
LABEL_22:
    puts("Wrong flag!");
    exit(-1);
  }
  v3 = 5LL;
  if ( strlen(&s1) - 1 > 5 )
  {
    while ( 1 )
    {
      v4 = *(&s1 + v3);
      v5 = 0;
      if ( v4 > 78 )
      {
        if ( (unsigned __int8)v4 == 'O' )
        {
          v6 = sub_400650(v10);
          goto LABEL_14;
        }
        if ( (unsigned __int8)v4 == 'o' )
        {
          v6 = sub_400660(v10);
          goto LABEL_14;
        }
      }
      else
      {
        if ( (unsigned __int8)v4 == '.' )
        {
          v6 = sub_400670(&v9);
          goto LABEL_14;
        }
        if ( (unsigned __int8)v4 == '0' )
        {
          v6 = sub_400680(&v9);
LABEL_14:
          v5 = v6;
          goto LABEL_15;
        }
      }
LABEL_15:
      if ( !(unsigned __int8)sub_400690(asc_601060, (unsigned int)v10[0], v9) )
        goto LABEL_22;
      if ( ++v3 >= strlen(&s1) - 1 )
      {
        if ( v5 )
          break;
LABEL_20:
        v7 = "Wrong flag!";
        goto LABEL_21;
      }
    }
  }
  if ( asc_601060[8 * v9 + v10[0]] != 35 )
    goto LABEL_20;
  v7 = "Congratulations!";
LABEL_21:
  puts(v7);
  return 0LL;
}

其中4个if判断的函数分别是
sub_400650($v10):

1
2
3
4
5
6
7
bool __fastcall sub_400650(_DWORD *a1)
{
  int v1; // eax
 
  v1 = (*a1)--;
  return v1 > 0;
}

sub_400660($v10):

1
2
3
4
5
6
7
8
bool __fastcall sub_400660(int *a1)
{
  int v1; // eax
 
  v1 = *a1 + 1;
  *a1 = v1;
  return v1 < 8;
}

sub_400670($v9):

1
2
3
4
5
6
7
bool __fastcall sub_400670(_DWORD *a1)
{
  int v1; // eax
 
  v1 = (*a1)--;
  return v1 > 0;
}

sub_400680($v9):

1
2
3
4
5
6
7
8
bool __fastcall sub_400680(int *a1)
{
  int v1; // eax
 
  v1 = *a1 + 1;
  *a1 = v1;
  return v1 < 8;
}

迷宫显示地图: @是到终点的路径,我自己方便看加上的。

1
2
3
4
5
6
7
8
@******
*@@@*  *
***@* **
**@@* **
* @*#@@*
**@***@*
**@@@@@*
********

更具体的可以看这个语雀链接:https://www.yuque.com/docs/share/2ba4597f-4066-4a6b-a14a-50abbf7a1a20?#

感谢各位师傅,谢谢各位。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2022-4-9 22:20 被木头人着灬了编辑 ,原因:
上传的附件:
收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 1133
活跃值: (6144)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
LABEL_20:
        v7 = "Wrong flag!";
        goto LABEL_21;
      }
    }
  }
  if ( asc_601060[8 * v9 + v10[0]] != 35 )
    goto LABEL_20;
  v7 = "Congratulations!";


8*v9+v10[0]你既然已知是8x8的迷宫,那么v9很明显是上下移动的,v10是左右移动的。因为都是a1-1或则+1只有上一行或则下一行需要*8,明白了吗
2022-4-10 02:12
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
v9表示y坐标,v10表示x坐标
画一个坐标系,坐标为(x,y),必须满足0<x<8,0<y<8,画出这个图你再把迷宫地图套上去你就懂了
2022-4-11 11:35
0
雪    币: 85
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
那年没下雪 LABEL_20: v7 = "Wrong flag!"; goto LABEL_21; } } } if ...

您好,首先谢谢您的帮助。

关于怎么判断符号对应的操作我想通了。 但是我对于我判断地图格式的思路有点疑惑,请问您是否可以帮忙检查一下?

我判断地图是8*8格式的方式是通过sub_400690来判断的


```


__int64 __fastcall sub_400690(__int64 a1, int a2, int a3)
{
  __int64 result; // rax

  result = *(unsigned __int8 *)(a1 + a2 + 8LL * a3);
  LOBYTE(result) = (_DWORD)result == 32 || (_DWORD)result == 35;
  return result;
}

```

由于在程序主体中

```

if ( !(unsigned __int8)sub_400690(asc_601060, (unsigned int)v10[0], v9) )


```

asc_601060是一个64字节的数据,然后在函数中进行了V9*8,因此我判断这个迷宫地图是一个8*8的格式。


我不知道我判断地图格式的思路是否正确,因为我感觉有点奇怪。所以我想请您抽空帮忙确认一下我的思路是否正确。谢谢您



2022-4-12 17:22
0
雪    币: 1133
活跃值: (6144)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
木头人着灬了 您好,首先谢谢您的帮助。关于怎么判断符号对应的操作我想通了。 但是我对于我判断地图格式的思路有点疑惑,请问您是否可以帮忙检查一下?我判断地图是8*8格式的方式是通过sub_400690来判断的```_ ...
是的,sub_400690这个函数里result=a1[a2+8*a3]那么每行当然是8个
2022-4-12 19:00
0
雪    币: 85
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
好的,谢谢师傅
2022-4-13 14:38
0
游客
登录 | 注册 方可回帖
返回
//