프로그램을 실행 시키면 다음과 같은 3D_FPS 게임이 시작 되게 됩니다.

저 달걀(?)을 몇방 쏘면 사라지며 게임내의 모든 달걀들을 없에더라도 클리어가 되질 않습니다.


또한 HP10은 달걀과 몸을 부딕쳤을 경우 피가 소모 됩니다.

상단바 위의 ReversingKr / FPS는 값이 시시각각 변하긴 하는데 그닥 중요한 값이 아니라 생각이 들었습니다.





Ollydbg의 막강한 기능중 하나인 Search for all referenced string를 이용하여 Game Clear 부분을 따라 가보았고

그곳으로 억지로 강제로 분기를 조작하여 출력을 했더니 이상한 값을 출력 했습니다.

이 이상한 값을 메모리 덤프에서 검색을 해 보았더니 00407028의 주소값에 있는 값을 출력함을 알 수 있었습니다.



스크린샷을 찍으면서 보니 MessageBox함수에 PUSH 00407028이 보이네요^^;; (왜 검색했지..)



이 값들을 분명히 바꿔주는 무언가가 있을꺼라 생각했고 현재 게임상에서 달걀을 죽이는것 밖에 없으니 달걀을 마구마구 쏴댔습니다.

그 결과 달걀 하나를 죽일때마다 값이 하나씩 바뀜을 알 수 있었습니다.


이 값들중 하나에 Hard Brack Point를 걸어서 값을 직접적으로 바꿔주는곳을 찾아 보았습니다.




그 결과 XOR BYTE PTR [EAX+407028], CL의 부분에서 값을 바꿔줌을 확인 할 수 있었습니다.



소스코드를 해석하자면은 00403440의 함수에서 내가 쏜 달걀의 주소값을 가져 옵니다.

가령 첫번째 달걀은 0x01, 27번째 달걀은 0x1B의 값을 eax에 리턴 해 줍니다.

리턴한 eax값을 ecx로  복사 한 후  210을 곱해주고, 그 값과 +409190을 하여서 있는 달걀의 피를 -2씩 해줍니다.

달걀의 피가 0이 되었을때, eax에 210을 곱한값 + 409184에 있는 값을 가져와서 eax+407028의 값과 xor을 해 줍니다.




맵에 있는 모든 달걀을 학살(?)하니 다음과 같이 Congratulation Game Clear! Pass word is Thr3EDPr이라는 스트링값이 나왔습니다.

신나게 인증을 하려 했지만 Thr3EDPr로는 인증이 되질 않았습니다.


????


하던 찰나에


407058주소에 있는 F0과 A9가 보이게 되었고, 저 값을 저 알고리즘에 맞추어서 수동으로 바꾸어 주니

Thr3EDPr0m 이라는 Password 를 얻을 수 있었습니다.

'CAT-Security > 미분류' 카테고리의 다른 글

[CSAW CTF 2012] Reversing_400  (0) 2014.05.15
[Codegate2014] dodoCrackme_200  (0) 2014.05.13
[Reversing.kr] Direct3D_FPS  (6) 2014.05.08
[Secuinside2013] beist_attack_game_150  (0) 2014.05.02
gdb 명령어 요약집  (0) 2014.04.28
[Defcon 21 ctf] policebox  (0) 2014.04.08