1. 程式人生 > >南郵CTF逆向題第五道maze解題思路

南郵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(

"%s",&s1,0LL);//限制獲取輸入字串長度為24且必須開頭5個字元為"nctf{" 最後一個字元位"}"

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 =

(unsigned __int8)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}