[reversing.kr] Direct3D FPS 풀이
- 리버싱/reversing.kr
- 2020. 3. 11. 16:44
CodeEngn부터 reversing.kr Position 문제까지는 2017년에 작성해놨던 풀이를 옮겼던 것인데 (새로풀면서 거의 풀이가 바꼈지만) Direct3D FPS부터는 지금부터 틈틈히 새로 풀 예정이다. 계속 리버싱을 해왔던 것은 아니지만... 2017년에는 이 문제를 못풀었었는데 이번엔 풀 수 있게된 것을 보니 그래도 어느정도는 발전했나보다 :D
reversing.kr Direct3D FPS 풀이
이번 문제 zip에는 간단한 FPS 게임 파일과 data 폴더, D3DX9_43.dll 이 들어있다. 문제가 무엇인지 안나와있어서 무얼 해야하는 것인지 감이 오지 않기 때문에 일단 맵을 좀 살펴보기로 했다.
좀 더 들어가니 제작자가 카라 한승현 팬인지 한승현 사진과 걸어다니는 고구마들이 있다. 총을 쏴도 딱히 죽지는 않고 내 HP도 떨어지진 않고 맵 끝까지 들어가도 별다른 건 없었다. 참고로 고구마에 가까이 접근해서 부딪히면 메시지창과 함께 게임이 종료되고 처음엔 고구마에 총을 쏴도 죽지를 않아서 뭔가했는데 가까이 접근해서 가까이에서 쏘면 죽는다.
게임상에서 딱히 힌트를 얻지 못했기 때문에 WinMain부터 보기로 했다. dword_407020은 밑에 "HP: %d"로 출력하기 때문에 HP 값임을 알 수 있고 HP 값이 <=0이 되면 "Game Over!"라는 메시지창이 뜨게 된다.
실제로 HP 값을 확인해보면 0xA (10) 값이 들어있는 것을 볼 수 있다.
그리고 그 다음에 있는 함수 내부에 "Game Clear"라는 문자열이 있는데 result 값이 특정 값보다 크거나 같으면 "Game Clear!"라는 메시지창을 보게 된다.
각 데이터들이 의미하는 바를 모르기 때문에 일단 실행시켜보면, [989194]에는 1, [98F8B4]에는 0이 들어있다. 애초에 큰 무한루프 안에 있기도 했고 게임 진행을 하면서 수행되는 동작이나 결과에 따라 값이 계속 바뀔 것이라 예상한다.
일단 조건문을 JMP로 패치해서 Game Clear 메시지창이 뜨게끔 해봤는데 여기에 정답값이 뜨는게 맞는 것 같다. 암호화되어있는 듯.
메시지창에 뜬 문자열 주소에 값이 쓰이는 부분을 살펴보면, result 값에 따라 한바이트씩 xor 연산에 의해 값이 바뀌게 된다.
위 xor 부분이 무조건 실행이 되도록 적당히 nop으로 패치를 해주고 eax값을 적당히 줘봤더니 버퍼 한바이트가 바뀐 것을 볼 수 있었다. 고구마를 죽여보면서 eax값을 확인했는데 고구마를 죽인 수? 죽은 고구마 인덱스? 에 따라 result 값이 결정되는 듯 했다. 그리고 고구마가 몇개지는 모르지만 버퍼가 한바이트씩 변경되므로 버퍼길이인 0x33 수만큼 고구마도 존재할꺼라는 것을 추론할 수 있다. (참고로 윈도우10에서 느린건지 x64에서 느린건지 여한튼 윈도우7 x32에서 실행시키니까 프로그램이 훨씬 빨라서 환경을 좀 이동시켜서 주소 변경이 좀 있다.)
일단, 0xFFFFFFFF랑 비교하는 eax 값을 0부터 몇번정도 변경해주면서 실행시켜보았다. "Cong"가 나온다. 백퍼 콩크레츄레이션이다.
굳이 다할필요는 없어보여서 eax=20으로 좀 뛰어넘어주었다. "Game"...
시리얼스럽지 않기 때문에 또 뛰어넘었다. "~word is T". 여기서부터 나오기 시작한다.
0x33(51)까지 해주면 정답값이 나오게 된다.
'리버싱 > reversing.kr' 카테고리의 다른 글
[reversing.kr] Twist1 풀이 (0) | 2020.03.13 |
---|---|
[reversing.kr] ransomware 풀이 (0) | 2020.03.12 |
[reversing.kr] Position 풀이 (0) | 2020.03.10 |
[reversing.kr] ImagePrc 풀이 (0) | 2020.03.10 |
[reversing.kr] Replace 풀이 (0) | 2020.03.09 |