XCTF 新手 RE maze

XCTF 新手 RE maze

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

今天沒有心思複習,於是打開XCTF想找個題目做一下,結果發現這道題目有50多天沒解決,,,
想看看到底是什麼題目,這麼久沒寫,啊哈哈哈
在這裏插入圖片描述
由題目得知這個題可能是迷宮,,,,,
下載文件,用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位不知道,估摸着是路徑
在這裏插入圖片描述
接下來發現有類似於四個方位的東西:oO0.
在這裏插入圖片描述
容易知道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!
在這裏插入圖片描述
雙擊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多天的題目終於得到解決了~~:
在這裏插入圖片描述
以前還是學識太淺,感覺動都動不了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章