Reversing.kr Direct3D FPS

Reversing/리버싱 문제풀이

2015. 12. 8. 18:29



게임을 시작하면 총으로 돌아다니면서 이상한 인형을 죽일 수 있다.

다 죽여도 아무런 창도 안뜬다.

대신 인형이랑 부딪히면 hp가 감소하고 0이 되면 죽는다.

일단 인형을 어떻게 잡아서 해결할 수 있는것이 아닌것 같아 올리디버거로 까보았다.


우선  reference string을 보면 게임을 하면서는 보지 못한 game clear!라는 문자열이 박혀있다.

이를 추적해보았다.



00EF7028에 있는 TEXT를 메시지박스에 같이 출력을 하는 것을 볼 수있다.


보면 쓰잘데기 없는 글자들로 채워 져있다.

문자열의 끝인 00까지는 52개의 글자가 있었다.

이 값을 출력을 하는 것을 보고 값의 변화가 있는지 하드웨어 브포를 걸어놓았다.


 dword만큼 브레이크포인트를 걸었다.





몹을 두세마리 잡으니 브레이크 포인트가 위의 부분에서 걸렸다.


분석을 해본결과 매번 쓰레드가 돌며 만약 마우스포인터가 인형을 가르키면 인형의 hp가 0인지 확인을 하고

0이면 죽었다고 생각하고 특정연산을 거쳐 위의 문자열의 데이터에 값이 덮어씌어지는 루틴이였다.


덮어씌우는 루틴을 하는 과정은

우선 eax에는 0~52까지의 인형의 순서가 온다.

그리고 ecx = eax * 0x210 이다.

특정 오프셋(계속 바뀜)+ecx의 값과 0xEF7028의 eax번째 값을 xor한 결과가 덮어씌워지는 데이터이다.


python으로 이 코드를 짜보았다.



대충 다음과 같은 연산을 거친다고 보면 된다.

이 코드를 돌리려면 두개의 데이터가 필요하다.

우선 첫번째로 필요한 데이터는 0xEF7028에 저장되있는 52바이트이며, 이것은 얻기가 쉬운데

두번째로 필요한 데이터, 즉 특정 오프셋 + ecx 연산을 한 바이트가 52개 필요한데 오프셋이 바뀌고 연속적이지 않은 데이터이다.

그리고 프로그램이 실행 된 후 생성되는 데이터이므로 IDA를 이용하여 풀었다.


위의 연산을 하는 루틴에 적당히 브레이크 포인트를 걸고 간단히 메모리 값을 계산하여 출력하였다.



52개를 죽이기 너무 귀찮았는데 다행이 잘나왔다.