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多天的題目終於得到解決了~~:
以前還是學識太淺,感覺動都動不了