日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

南邮ctf php decode,南邮CTF RE5——MAZE

發(fā)布時(shí)間:2024/3/24 php 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 南邮ctf php decode,南邮CTF RE5——MAZE 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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的下一個(gè)字節(jié)

goto LABEL_14;

}

if ( v4 == 'o' )

{

v6 = sub_400660((int *)&v9 + 1); //v6為v9的下一個(gè)字節(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)的時(shí)候

int v1; // eax@1

v1 = (*a1)--;

return v1 > 0;

}

bool __fastcall sub_400660(int *a1)//(int *)&v9 + 1

{

///為o的時(shí)候

int v1; // eax@1

v1 = *a1 + 1;

*a1 = v1;

return v1 < 8;

}

bool __fastcall sub_400670(_DWORD *a1)//&v9

{

//為.的時(shí)候

int v1; // eax@1

v1 = (*a1)--;

return v1 > 0;

}

bool __fastcall sub_400680(int *a1)//(int *)&v9

{

//為0(0x30)的時(shí)候

int v1; // eax@1

v1 = *a1 + 1;

*a1 = v1;

return v1 < 8;

}

猜測8個(gè)字節(jié)為一行,v9表示豎向,v9的下一個(gè)字節(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這個(gè)題目就是迷宮了,上面的函數(shù)說明了在將EDI中的數(shù)與20h和23h比較,不符合就GG,來看看我們需要走的那個(gè)迷宮,就是地址為0000000000601060的HEX:

整理一下得到8X8的矩陣:

按照函數(shù)規(guī)則走一下

將走的線路換成上訴的四個(gè)字符,得到o0oo00O000oooo..OO即為flag

總結(jié)

以上是生活随笔為你收集整理的南邮ctf php decode,南邮CTF RE5——MAZE的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。