[Reversing.kr] Direct3D FPS

semon·2022년 11월 15일
0

Reversing

목록 보기
8/10

Reversing.kr의 Direct3D FPS 문제입니다.

DIE로 확인을 해보니 특별한 건 없습니다.

실행을 해보니 평범한 FPS 게임이 구현되어있고 몹인 gogooma가 있습니다.

몹을 다 잡으니 다음과 같이 이상한 문자가 있던 부분이 바뀌었습니다. 그러나 뭔가 부족하게 바뀌어서 결국 실행을 하긴 해야 할 것 같습니다.

이상한 문자를 출력하는 부분의 Title이 Game clear로 되어있어 이 부분을 실행시켜보려 했습니다.

그런데 조건을 만족해야 돼서 코드 패치를 통해서 강제로 실행시켰습니다.

그랬더니 다음과 같은 messageBox가 나타났습니다. 이상한 문자가 들어있는 부분이 몹을 잡으면서 바뀌었던 것과 이 부분을 실행하면 이 문자가 나타나는 것을 보아 이 부분이 flag인 것 같습니다.

이상한 문자열이 담긴 메모리에 hardware break point를 걸고 실행을 해보니

다음과 같은 코드가 나타났습니다. 이 부분을 보니 [eax+807028]과 cl을 xor 연산을 하고 있습니다. 이때 807028은 이상한 문자열이 저장되어 있는 메모리 주소이므로 이 xor 연산을 통해서 flag가 나온다는 사실을 유추할 수 있습니다. 따라서 cl에 값이 들어가기 전에 break point를 걸고 실행했습니다.

추가로 밑에 있던 부분을 보니 edx에 -2를 더하는 부분이 있었고 이 부분을 좀 더 자세히 확인하니 이때 edx에 저장된 값은 gogooma의 hp가 저장되어 있었습니다. 이 부분은 총을 쏘면 gogooma의 hp가 2씩 감소하는 걸 나타내는 것입니다.

따라서 분석 속도를 높이기 위해 이 부분을 -2에서 -0x64(100)으로 패치하여 진행했습니다.

gogooma를 하나 잡으니 다음과 같이 break point에 걸리고 다음과 같은 결과가 나왔습니다. eax의 값이 0xc이고 807028에 0xc를 더한 주소 값에 있는 값과 cl(30)을 xor 한 값을 807028에 0xc를 더한 주소 값에 저장했습니다.

하나를 더 잡아보니 규칙성을 찾을 수 있었습니다. eax의 값은 이상한 문자열의 index 값이고 cl에 저장되는 값은 eax* 4의 값이 저장되었습니다.
즉, [0x807028][eax] ^= (eax * 4)라는 식이 만들어집니다.

이렇게 알아낸 사실을 가지고 python으로 코드를 만들어보면 다음과 같이 나옵니다.

실행을 해보면 flag가 출력됩니다.

profile
보안을 공부합니다

0개의 댓글