블로그 이전했습니다. https://jeongzero.oopy.io/
[reversing.kr] Direct 3D FPS
본문 바로가기
워게임/reversing.kr

[reversing.kr] Direct 3D FPS

728x90

1. 문제


1) 문제 확인

서든 마냥 게임이 플레이된다. 괴상한 달걀같은 놈이 엄청 많이 나오는데 총으로 쏘면 죽는다. 그리고 몸에 닿으면 내 피가 깍이면서 죽는다. 근데 진짜 속도가 개느리고 한놈 죽이는데 너무 많이 총을 쏴야해서 답답해 뒤지는줄 알았다. 뭘 어케 하라는거지?

2) 코드흐름 파악

int *sub_4039C0()
{
  int *result; // eax

  result = clear_monster;
  while ( *result != 1 )
  {
    result += 0x84;
    if ( (int)result >= (int)&check_flag )
    {
      MessageBoxA(hWnd, msg_content, "Game Clear!", 0x40u);
      return (int *)SendMessageA(hWnd, 2u, 0, 0);
    }
  }
  return result;
}

문자열을 보던 중 'Game Clear!' 를 참조하여 해당 함수를 확인하였다. result가 1이 아닐때 0x84만큼 더하고 그 값이 check_flag보다 크면 성공하는거 같다. 출력되는 메시지 함수내용을 확인해보면

널 바이트 전까지 대략 0x32 사이즈의 이상한 문자열이 들어가 있다. 저거를 복구시면 될듯?

2. 접근방법


위 문자열을 참조하는 다른 영역을 확인해보니 다음 함수를 발견했다

int __thiscall sub_403400(void *this)
{
  int monster; // eax
  int monster_hp; // edx

  monster = ((int (__cdecl *)(void *))sub_403440)(this);
  if ( monster != -1 )
  {
    monster_hp = v3[0x84 * monster];
    if ( monster_hp > 0 )
    {
      v3[0x84 * monster] = monster_hp - 2;
    }
    else
    {
      clear_monster[0x84 * monster] = 0;
      msg_content[monster] ^= decode_key[0x210 * monster];
    }
  }
  return monster;
}

결론부터 말하면, 사용자가 총구의 포커스를 달걀귀신에 갖다댄 뒤 총을 한발 쏘면 여기 함수에 bp가 걸린다. monster에 들어있는 값이 -1이 아니면, 해당 값을 인덱스로 하여 v3 배열의 어떤 값을 가져온다. 여기는 아마도 달걀귀신의 hp로 추정된다.

달걀귀신의 hp가 0보다 크면 아직 안죽었다는 의미로 -2를 하고 다시 저장한다. 즉 v3[0x84*monster] 요거는 달걀귀신의 피가 저장된다. 그리고 monster에는 달걀귀신의 ID값이라고 보면 된다. 만약 달걀귀신의 hp가 0이면 아까 괴상한 문자열의 한바이트를 decode_key로 디코딩한다.

그럼 저 디코드 키만 뭔지 알면 끝난다. 아이다로는 알기힘들어서 이후부턴 디버깅을 통해 확인하였다.

위 로직이 디코딩 루틴이다.

  • 0xF97028 : 괴상한 문자열의 위치
  • 0xF99184 : 디코딩 키 배열의 위치
  • cl( 0xF99184 + ecx ) : 0xF9AE64 ⇒0x38
  • eax : 0xE // 달걀귀신 ID

즉 괴상한 문자열 + 0xE 위치의 한 바이트와 cl(0x38)을 xor하여 디코딩한다.

다른 달걀귀신을 죽여서 반복되는 패턴이 있는지 찾아보자

이번에는 ID값이 0x26인 달걀귀신을 죽였다. 그럼 괴상한 문자열 + 0x26에 위치한 값을 디코딩하는데 그때사용하는 키 값은 0x98이다. 여기서 보면 패턴이 보인다

디코딩 키 값은 달걀귀신 ID 값 * 4 이다. 따라서 괴상한 문자열을 한바이트씩 각 인덱스 * 4와 xor 연산을 하면 디코딩된 문자열을 얻을수 있을 것이다

3. 풀이


4. 몰랐던 개념


728x90

'워게임 > reversing.kr' 카테고리의 다른 글

[reversing.kr] Ransomware  (0) 2020.12.22
[reversing.kr] Position  (0) 2020.12.16
[reversing.kr] ImagePrc  (0) 2020.12.15
[reversing.kr] Replace  (0) 2020.12.14
[reversing.kr] Music Player.exe  (0) 2020.12.11