VishwaCTF 2025 Rev Writeup

有點通靈的比賽,但至少 Reverse 不會太通。

周六 5月 17 2025
555 字 · 4 分鐘

Reverse

snake

一開始會少 libstdc++-6.dlllibgcc_s_dw2-1.dll 這兩個,所以沒辦法跑起來,直接用 MINGW64 裝就可以了。

  • 跑起來後可以看到是一個貪吃蛇的遊戲。

image

你是那個 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

image

  • 先執行到把地圖、什麼的都用好。
  • 開空白鍵直接 jmp 0x004019A1

image

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

image

VishwaCTF{th3r3_4r3_5n4k35_all_4r0und}

safe box

image

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

image

  • 不想逆了 @@

而且用 dnspy 執行還要 patch 他的 mono dll 好麻煩

MelonLoader + UnityExplorer 根本就像開掛一樣

我裝起來之後打開遊戲,用一個叫 object explorer 的功能 直接把保險箱刪掉就可以看到 FLAG 了!

image

image

點進去左邊,把 gameobject destroy

image

VishwaCTF{h3r3_y0u_@r3}


Thanks for reading!

VishwaCTF 2025 Rev Writeup

周六 5月 17 2025
555 字 · 4 分鐘