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

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다