南邮ctf php decode,南邮CTF RE5——MAZE
MAZE拖進(jìn)winhex發(fā)現(xiàn)是elf文件,ida64打開,調(diào)出main函數(shù),反編譯:
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
signed __int64 v3; // rbx@4
signed int v4; // eax@5
bool v5; // bp@5
bool v6; // al@8
const char *v7; // rdi@19
__int64 v9; // [sp+0h] [bp-28h]@1
v9 = 0LL;
puts("Input flag:");
scanf("%s", &s1, 0LL);
if ( strlen(&s1) != 24 || strncmp(&s1, "nctf{", 5uLL) || *(&byte_6010BF + 24) != 125 )
{
LABEL_22:
puts("Wrong flag!");
exit(-1);
}
v3 = 5LL;
if ( strlen(&s1) - 1 > 5 )
{
while ( 1 )
{
v4 = *(&s1 + v3);
v5 = 0;
if ( v4 > 78 )
{
v4 = (unsigned __int8)v4;
if ( (unsigned __int8)v4 == 'O' )
{
v6 = sub_400650((_DWORD *)&v9 + 1); //v6為v9的下一個字節(jié)
goto LABEL_14;
}
if ( v4 == 'o' )
{
v6 = sub_400660((int *)&v9 + 1); //v6為v9的下一個字節(jié)
goto LABEL_14;
}
}
else
{
v4 = (unsigned __int8)v4;
if ( (unsigned __int8)v4 == '.' )
{
v6 = sub_400670(&v9); //v6為v9的本字節(jié)
goto LABEL_14;
}
if ( v4 == '0' )
{
v6 = sub_400680((int *)&v9); //v6為v9
LABEL_14:
v5 = v6;
goto LABEL_15;
}
}
LABEL_15:
if ( !(unsigned __int8)sub_400690((__int64)asc_601060, SHIDWORD(v9), v9) )
goto LABEL_22;
if ( ++v3 >= strlen(&s1) - 1 )
{
if ( v5 )
break;
LABEL_20:
v7 = "Wrong flag!";
goto LABEL_21;
}
}
}
if ( *(&asc_601060[8 * (signed int)v9] + SHIDWORD(v9)) != 35 ) ///v9為行數(shù)
goto LABEL_20;
v7 = "Congratulations!";
LABEL_21:
puts(v7);
return 0LL;
}
/SHIDWORD///查了一下IDA的宏定義 #define HIDWORD(x) (((_DWORD)&(x)+1))
太長了,簡單看了一下,對輸入的字符串限制了24的長度,保證以“nctf{”開頭,“}”結(jié)尾。換成graph view:
可以看到他根據(jù)判斷是否為'.','0','o','O'來決定進(jìn)行什么操作
bool __fastcall sub_400650(_DWORD *a1)//(_DWORD *)&v9 + 1
{
//為O(0x4f)的時候
int v1; // eax@1
v1 = (*a1)--;
return v1 > 0;
}
bool __fastcall sub_400660(int *a1)//(int *)&v9 + 1
{
///為o的時候
int v1; // eax@1
v1 = *a1 + 1;
*a1 = v1;
return v1 < 8;
}
bool __fastcall sub_400670(_DWORD *a1)//&v9
{
//為.的時候
int v1; // eax@1
v1 = (*a1)--;
return v1 > 0;
}
bool __fastcall sub_400680(int *a1)//(int *)&v9
{
//為0(0x30)的時候
int v1; // eax@1
v1 = *a1 + 1;
*a1 = v1;
return v1 < 8;
}
猜測8個字節(jié)為一行,v9表示豎向,v9的下一個字節(jié)為橫向,O為左移一位,o為右移一位,.為上移一位,0為下移一位。根據(jù)下圖,判斷出偏移為601060的地方放著我們要比較的東西,他依次把數(shù)據(jù)交給寄存器EDI,調(diào)用函數(shù):
sub_400690 proc near
movsxd rax, esi
add rax, rdi
movsxd rcx, edx
movzx eax, byte ptr [rax+rcx*8]
cmp eax, 20h
setz cl
cmp eax, 23h
setz al
or al, cl
retn
sub_400690 endp
MAZE這個題目就是迷宮了,上面的函數(shù)說明了在將EDI中的數(shù)與20h和23h比較,不符合就GG,來看看我們需要走的那個迷宮,就是地址為0000000000601060的HEX:
整理一下得到8X8的矩陣:
按照函數(shù)規(guī)則走一下
將走的線路換成上訴的四個字符,得到o0oo00O000oooo..OO即為flag
總結(jié)
以上是生活随笔為你收集整理的南邮ctf php decode,南邮CTF RE5——MAZE的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux管道命令(pipe)全
- 下一篇: 猿创征文|Spring系列框架之面向切面