콘텐츠로 건너뛰기

Direct3D FPS

프로그램을 실행시키면 게임 화면이 나타난다.
프레임이 너무 낮게 나와 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

태그:

답글 남기기