본문 바로가기
Information Security/Reversing

[Code injection] 지뢰 찾기 핵 만들기 - 무적

by 이키마스 2022. 1. 3.

이번 포스팅은 윈도우 xp 지뢰 찾기 무적을 핵을 만드는 것을 진행해 보겠습니다.

펑 하는 소리를 나게 해주는 함수는 PlaySoundW입니다. 그 함수를 IDA의 임포트 기능을 활용해서 찾아주고,

크로스 레퍼런스를 활용하여 어디에서 콜이 되는지 확인을 해줍니다.

sub_10038ED:loc_1003937 부분을 클릭해보면 위와 같은 그래프가 보이는데

3가지의 케이스에 따라서 소리를 분류하는 거 같습니다.

(지뢰 밟으면 펑 하는 소리, 그냥 클릭하면 나오는 소리, 게임 배경음을 나누는 것이라 보면 됩니다.)

저 케이스 중 하나가 지뢰를 밟으면 펑 하는 소리입니다.

원하는 부분을 클릭 후 스페이스 키를 누르면 위와 같이 나오는데

1003903,1003915,1003927 부분을 이뮤니티 디버거를 통해서 실행시켜서

지뢰를 밟으면 멈추는 곳을 찾으면 됩니다.

1003903 부분에 브레이크 포인트를 두고 실행해서 지뢰를 밟았더니 1003903부분에서 멈추었습니다.

1003903이 어디에서 콜이 되었는지 확인하기 위해서 Call Stack을 사용하여서 확인을 하였더니

10035AB 부분에서 콜이 되었더라는 것을 확인하였습니다.

지뢰를 밟고 CALL 0100347C를 실행하였더니 게임오버가 되었습니다.

즉 CALL 0100347C 부분이 게임오버 부분입니다.

그 부분을 좀 위로 올려보면 JMP SHORT 010035AB가 있는데

CALL 0100347C 부분으로 점프하는 구문입니다.

JMP SHORT 010035AB 부분으로 가지 말고 다른 코드로 가게 실행하면 지뢰를 밟아도 게임 오버가 되지 않고, 무적이 되는 것입니다.

0100347C를 분석해본 결과 PUSH 0이 CALL 0100347C가 실행될 때 파라미터로 실행되서 게임오버가 되는 파라미터 입니다.

PUSH 1을 넣고 CALL 0100347C을 실행하면 승리하는 코드 입니다.

(이것을 통해서 지뢰를 밟으면 승리하는 코드로 바꿀 수 있습니다)

그 부분을 NOP로 없애고, JMP 010035B0 부분으로 바꾸어주면 게임오버 코드가 실행이 되지 않습니다.

반응형

댓글