Reverse
snake
一開始會少 libstdc++-6.dll 跟 libgcc_s_dw2-1.dll 這兩個,所以沒辦法跑起來,直接用 MINGW64 裝就可以了。
- 跑起來後可以看到是一個貪吃蛇的遊戲。

你是那個 O,然後吃到 F 就可以加一分 把他拖進 IDA 看看吧!
int __cdecl main(int argc, const char **argv, const char **envp){ __time32_t v3; // eax int v4; // eax int v5; // ebx int v6; // eax int v7; // eax int v9; // [esp-Ch] [ebp-10h] int v10; // [esp-8h] [ebp-Ch]
__main(); v3 = time(0); srand(v3); HIDE_CURSOR(); INIT_GAME(); SPAWN_FOOD(); while ( !GAME_OVER ) { if ( _kbhit() ) { v4 = _getch(); if ( v4 == 100 ) { DX = 1; DY = 0; } else if ( v4 > 100 ) { if ( v4 == 115 ) { DX = 0; DY = 1; } else if ( v4 == 119 ) { DX = 0; DY = -1; } } else if ( v4 == 97 ) { DX = -1; DY = 0; } } MOVE_SNAKE(); DRAW_GAME(); if ( CHAKDE == 9999 ) SHOW_FLAG(); Sleep(0x64u); } v5 = CHAKDE; v6 = std::operator<<<std::char_traits<char>>(&std::cout, "Game Over! Score: ", v9, v10); v7 = std::ostream::operator<<(v6, v5); std::ostream::operator<<(v7, &std::endl<char,std::char_traits<char>>); return 0;}- 其實蠻直觀的,會先設定好 GAME 的一些東西後開始遊戲。
- 當
CHAKDE == 9999時就會顯示 FLAG。 - 不難猜出 CHAKDE 應該就是分數。
但問題是我們地圖畫面就這麼小,正常玩是不可能的。 我這邊的想法是用 gdb 讓他跑到遊戲都設置好後,跳過去 show_flag 那邊就可以獲得 FLAG 了。
flag 的位址
.text:004019A1 ; int SHOW_FLAG(void).text:004019A1 public __Z9SHOW_FLAGv.text:004019A1 __Z9SHOW_FLAGv proc near ; CODE XREF: _main+E4↓p.text:004019A1.text:004019A1 var_20 = byte ptr -20h.text:004019A1 var_4 = dword ptr -4.text:004019A1.text:004019A1 ; __unwind { // ___gxx_personality_v0
- 先執行到把地圖、什麼的都用好。
- 開空白鍵直接
jmp 0x004019A1

跳過去之後 flag 就出現在 EAX 了

VishwaCTF{th3r3_4r3_5n4k35_all_4r0und}
safe box

- 一個實作保險箱的 Unity 遊戲,可以讓你輸入密碼甚麼的 (你輸入太多還會跟你講你輸入太多次)
- dnspy 打開直接開逆。

- 不想逆了 @@
而且用 dnspy 執行還要 patch 他的 mono dll 好麻煩
MelonLoader + UnityExplorer 根本就像開掛一樣
我裝起來之後打開遊戲,用一個叫 object explorer 的功能 直接把保險箱刪掉就可以看到 FLAG 了!


點進去左邊,把 gameobject destroy

VishwaCTF{h3r3_y0u_@r3}
Thanks for reading!