XCTF 新手 RE maze

XCTF 新手 RE maze

一天一道CTF题目,能多不能少

今天没有心思复习,于是打开XCTF想找个题目做一下,结果发现这道题目有50多天没解决,,,
想看看到底是什么题目,这么久没写,啊哈哈哈
XCTF 新手 RE maze_第1张图片
由题目得知这个题可能是迷宫,,,,,
下载文件,用ida打开(64位)
找到主函数~,太长了不好截图,就把源码贴出来吧,源码如下:

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  const char *v3; // rsi
  signed __int64 v4; // rbx
  signed int v5; // eax
  char v6; // bp
  char v7; // al
  const char *v8; // rdi
  __int64 v10; // [rsp+0h] [rbp-28h]

  v10 = 0LL;
  puts("Input flag:");
  scanf("%s", &s1, 0LL);
  if ( strlen(&s1) != 24 || (v3 = "nctf{", strncmp(&s1, "nctf{", 5uLL)) || *(&byte_6010BF + 24) != '}' )
  {
LABEL_22:
    puts("Wrong flag!");
    exit(-1);
  }
  v4 = 5LL;
  if ( strlen(&s1) - 1 > 5 )
  {
    while ( 1 )
    {
      v5 = *(&s1 + v4);
      v6 = 0;
      if ( v5 > 'N' )
      {
        v5 = (unsigned __int8)v5;
        if ( (unsigned __int8)v5 == 'O' )
        {
          v7 = sub_400650((_DWORD *)&v10 + 1);
          goto LABEL_14;
        }
        if ( v5 == 'o' )
        {
          v7 = sub_400660((int *)&v10 + 1);
          goto LABEL_14;
        }
      }
      else
      {
        v5 = (unsigned __int8)v5;
        if ( (unsigned __int8)v5 == '.' )
        {
          v7 = sub_400670(&v10, v3);
          goto LABEL_14;
        }
        if ( v5 == '0' )
        {
          v7 = sub_400680((int *)&v10);
LABEL_14:
          v6 = v7;
          goto LABEL_15;
        }
      }
LABEL_15:
      v3 = (const char *)HIDWORD(v10);
      if ( !(unsigned __int8)sub_400690(asc_601060, HIDWORD(v10), (unsigned int)v10) )
        goto LABEL_22;
      if ( ++v4 >= strlen(&s1) - 1 )
      {
        if ( v6 )
          break;
LABEL_20:
        v8 = "Wrong flag!";
        goto LABEL_21;
      }
    }
  }
  if ( asc_601060[8 * (signed int)v10 + SHIDWORD(v10)] != '#' )
    goto LABEL_20;
  v8 = "Congratulations!";
LABEL_21:
  puts(v8);
  return 0LL;
}

分析一波~~
首先是输入为24位长的字符串,并且包括nctf{},否则错误
所以就只剩下18位不知道,估摸着是路径
XCTF 新手 RE maze_第2张图片
接下来发现有类似于四个方位的东西:oO0.
XCTF 新手 RE maze_第3张图片
容易知道v9就是一个二维数组
那么就很容易判断这四个分别代表什么方向了
查看这四个函数:

//O并且&v9 + 1
bool __fastcall sub_400650(_DWORD *a1)
{
  int v1; // eax
  v1 = (*a1)--;
  return v1 > 0;
}

//o并且&v9 + 1
bool __fastcall sub_400660(int *a1)
{
  int v1; // eax
  v1 = *a1 + 1;
  *a1 = v1;
  return v1 < 8;
}

//.并且&v9
bool __fastcall sub_400670(_DWORD *a1)
{
  int v1; // eax
  v1 = (*a1)--;
  return v1 > 0;
}

//0并且&v9
bool __fastcall sub_400680(int *a1)
{
  int v1; // eax
  v1 = *a1 + 1;
  *a1 = v1;
  return v1 < 8;
}

得知了这些信息,那么我们就很容易知道方向了
v9+1表示二维的,也就是左右,
所以这四个表示方向分别为:

O左
o右
.上
0下

分析完之后,还有一个信息就是,这个地图是8*8的
并且还有个地图好像还不知道,继续往下看,,,
看到有Congratulations!,
并且知道是要走到#位置,否则就会跳到Wrong flag!
XCTF 新手 RE maze_第4张图片
双击asc_601060查看,得到地图:
在这里插入图片描述
不过这样不好看,用01来进行表示:

s = "  *******   *  **** * ****  * ***  *#  *** *** ***     *********"

x = ""
for i in s:
	if i == ' ':
		x += '0'
	elif i == '*':
		x += '1'
	else:
		x += i
print(x)


00111111
10001001
11101011
11001011
1001#001
11011101
11000001
11111111

最后从头开始走到#就可以了,只能走0
最后得到flag:nctf{o0oo00O000oooo..OO}

50多天的题目终于得到解决了~~:
XCTF 新手 RE maze_第5张图片
以前还是学识太浅,感觉动都动不了

你可能感兴趣的:(CTF题,一天一道CTF,XCTF)