南郵CTF逆向題第五道maze解題思路
如題
先百度一下名字 萬一有收穫呢 猜測可能考到迷宮演算法
依舊是ELF
直接載入IDA
我一般習慣先shift+f12看下字串
再看看main
__int64 __fastcall main(__int64 a1,char**a2,char**a3)
{
constchar*v3;// rsi
signed __int64 v4;// rbx
signedint v5;// eax
char v6;// bp
char v7;// al
constchar*v8;// rdi
__int64 v10;// [rsp+0h] [rbp-28h]
v10 =0LL;
puts("Input flag:");
scanf(
if( strlen(&s1)!=24||(v3 ="nctf{", strncmp(&s1,"nctf{",5uLL))||*(&byte_6010BF +24)!=125)
{
LABEL_22:
puts("Wrong flag!");
exit(-1);
}
v4 =5LL;
if( strlen(&s1)-1>5)
{
while(1)
{
v5 =*(&s1 + v4);
v6 =0;
if( v5 >78)
{
v5
=
if((unsigned __int8)v5 ==79)
{
v7 = sub_400650((char*)&v10 +4, v3);
goto LABEL_14;
}
if( v5 ==111)
{
v7 = sub_400660((char*)&v10 +4, v3);
goto LABEL_14;
}
}
else
{
v5 =(unsigned __int8)v5;
if((unsigned __int8)v5 ==46)
{
v7 = sub_400670(&v10, v3);
goto LABEL_14;
}
if( v5
==48)
{
v7 = sub_400680(&v10, v3);
LABEL_14:
v6 = v7;
goto LABEL_15;
}
}
LABEL_15:
v3 =(constchar*)HIDWORD(v10);
if(!(unsigned __int8)sub_400690(asc_601060, HIDWORD(v10),(unsignedint)v10))
goto LABEL_22;
if(++v4 >= strlen(&s1)-1)
{
if( v6 )
break;
LABEL_20:
v8 ="Wrong flag!";
goto LABEL_21;
}
}
}
if( asc_601060[8*(signedint)v10 + SHIDWORD(v10)]!=35)
goto LABEL_20;
v8 ="Congratulations!";
LABEL_21:
puts(v8);
return0LL;
}
下邊全是goto語句 我們直接將檢視切為圖表(Graph view)
按r可以發現
根據這四個字元"." ,"0","o" , "O"分別跳到不同的位置進行操作
我們再看下400690在搞什麼鬼
想到是和601060有關
猜測是判斷上面601060陣列的第edi個值是否等於20h或23h,如果不等於就跳到
400822輸出"wrong flag"
那麼我們現在要做的就是看下601060這個地址 直接切到HEX介面
發現恰好為一個八階方陣,而且數值只有3個,分別為20h,2Ah以及23h
那麼函式400690的意思不就是判斷當前的位置是否是從(0,0)走到(4,4),最初的四個跳轉應該就是對應著上下左右四個方向
路徑為:右下右右下下左下下下右右右右上上左左
o0oo00O000oooo..OO
還沒完,記得要加上nctf{}
我們得到flag為nctf{o0oo00O000oooo..OO}