Iriton's log

[Reversing] 지뢰찾기 무적 승리/디버거 메모리 주소 조작 본문

Security Lab

[Reversing] 지뢰찾기 무적 승리/디버거 메모리 주소 조작

Iriton 2023. 11. 1. 10:09

목표

지뢰게임 리버싱을 통해 어느 칸을 누르든 첫 클릭에 바로, 무조건 승리할 수 있게 할 것이다.
dll Injection은 아니고 단순히 디버거로 메모리 주소 조작만 할 것이다.
나중에 dll도 만들어 볼 계획이다.


추론


지뢰 게임은 어떠한 칸을 클릭하면 그 칸이 지뢰냐, 아니냐에 따라 띄우는 결과가 다 다르다.
지뢰 게임에서 승리하게 되면 이름을 입력하라는 팝업이 뜬다.
해당 팝업을 띄우는 함수를 호출하는 주소를 찾아내어,
승리 시 처리되는 함수 주소를 유추하여 알아낸다.
알아낸 주소를 기억한다.
어떤 칸을 클릭할 때의 이벤트로, 기억해둔 승리 함수 주소로 이동하게 한다면
어떠한 칸을 선택해도 승리 함수로 이동하여 승리한 것으로 처리될 것이다.

 

메모리 조작 방식을 이용


추론 방법에서 좀 더 구체적으로 유추를 해서 메모리를 조작해 보았다.
어떤 곳을 누르든(어떤 곳을 클릭하든) 지뢰게임에서 승리하도록 만들어야 한다.

맨 처음 클릭을 할 때 발생하는 이벤트를 어떻게 알 수 있을까?

이 이벤트를 탐구하기보다는,
첫 클릭이 발생할 때 즉, 지뢰게임을 시작하면 타이머가 실행되는 것을 이용해 보자.

IDA로 winmine을 킨다.



SetTiimer가 보인다.
해당 주소는 010010B4이다.
이 주소를 CALL 하는 것은 어디일까?

더블 클릭하면 아래 화면이 보인다.

 



원하는 부분을 우클릭한 후
Xrefs graph to 를 이용하면 시작부터 해당 함수까지의 순서도 같은 게 보인다.

이로써 10037E1에서 SetTimer를 띄우는 것을 알 수 있다.
이제 승리하는 주소가 어딘지 알아내야 한다.
승리할 때는 소리가 나온다.
하지만 소리가 나오는 케이스는 실패할 때도 포함이 된다.
일단 위와 같은 방식으로 소리 실행 함수를 찾아보자.



 

우클릭 한 후 cross reference를 이용하면 위와 같은 화면을 띄우며 어디서 call 한지 볼 수 있다.


loc_1003937 부분을 클릭해서 보면 케이스 3개가 있다.
이 중 하나가 승리 케이스일 것이다.

디버거에서 위 세 케이스 시작 주소에 BP를 걸어두고 실패, 승리 시에 어디서 Break가 걸리는지 확인해서 승리 포인트를 찾는다.
승리 시, 1003915에서 멈췄다.

디버거에서 1003915가 어디서 호출되는지 알아보기 위해 call stack을 확인했다.(Alt+K)

이걸 토대로 10035AB로 이동했다.


그럼 이 두 줄이 뜨는데(위에 코드는 CMP와 JNZ라 상관없는 내용인 거 같아서 제외했다.)
찾아 보니 PUSH 1은 승리 플래그 같은 거다.
0은 패배, 1은 승리 로 추정된다.

따라서 저 두 줄을 아까 SetTimer 호출 코드 대신 넣어주자.

10037E1로 이동해서
push 1
call 0100347C
로 조작해 주고 실행해 보자.

실행 영상 첨부

'Security Lab' 카테고리의 다른 글

Visual Studio 이용하여 ShellCode 제작  (1) 2023.12.04
Stack BOF - RET Overwrite  (1) 2023.12.04
Stack Overflow 실습  (3) 2023.11.20
Comments