프로그램을 실행시키면 게임 화면이 나타난다.
프레임이 너무 낮게 나와 XP / 저해상도 800×600 환경에서 플레이하는 것을 추천하는데, 그래도 낮다.
Analysis
WinMain
WinMain 함수의 일부 코드를 살펴보면,
HP가 다 닳았을때, Game Over! 메시지창을 띄운다.
바로 그 뒤에 있는 sub_4039C0 함수를 살펴보면,
byte_407028에 있는 내용과 함께 Game Clear! 창을 띄우는 것을 확인할 수 있다.
byte_407028는 암호화되었기에 역참조해서 복호화하는 함수를 살펴봤더니
sub_403400에서 xor하는 것을 확인할 수 있다.
sub_403400 함수에 대해 살펴보자.
int __thiscall sub_403400(void *this) { int result; // eax int v2; // edx result = sub_403440(); if ( result != -1 ) { v2 = unk_409190[132 * result]; if ( v2 > 0 ) { unk_409190[132 * result] = v2 - 2; } else { unk_409194[132 * result] = 0; byte_407028[result] ^= unk_409184[528 * result]; } } return result; }
byte_407028[0] ^= unk_409184[528*0]
byte_407028[1] ^= unk_409184[528*1]
byte_407028[2] ^= unk_409184[528*2]
…
이렇게 복호화된다는 것을 확인할 수 있다.
디버깅을 해서 값들을 확인해보면,
unk_409184[528*0] = 0,
unk_409184[528*1] = 4,
unk_409184[528*2] = 8,
…
이렇게 4씩 증가한다는 것을 알 수 있다.
solve.py
byte_407028 = \ [0x43, 0x6B, 0x66, 0x6B, 0x62, 0x75, 0x6C, 0x69,\ 0x4C, 0x45, 0x5C, 0x45, 0x5F, 0x5A, 0x46, 0x1C,\ 0x07, 0x25, 0x25, 0x29, 0x70, 0x17, 0x34, 0x39,\ 0x01, 0x16, 0x49, 0x4C, 0x20, 0x15, 0x0B, 0x0F,\ 0xF7, 0xEB, 0xFA, 0xE8, 0xB0, 0xFD, 0xEB, 0xBC,\ 0xF4, 0xCC, 0xDA, 0x9F, 0xF5, 0xF0, 0xE8, 0xCE,\ 0xF0, 0xA9] for i in range(len(byte_407028)): print(chr(byte_407028[i] ^ (4*(i))), end='')
Result
PS C:\Users\Seo Hyun-gyu\Downloads\Direct3D_FPS> python3 solve.py Congratulation~ Game Clear! Password is Thr3EDPr0m
FLAG
Thr3EDPr0m