일단 "1분 미리~"를 띄우는 메세지 박스 함수의 주소를 찾는다.
(rtcMsgBox함수의 주소가 0x0040104C인 것을 볼수있다!)
이 함수 주소에 하드웨어 브레이크 포인트를 사용하여, 어느 부분에서 이 함수를 통해 "1분 미리~"라는 문자열을 출력하는지 찾아낸다.
브레이크 포인트 때문에 프로그램이 중지되었을 때, Call Stack을 통해서 함수를 호출한 코드의 주소를 참조한다.
그러면 이렇게 rtcMsgBox함수가 사용된 것을 볼 수 있는데, 이 메세지는 1분이 지날 때에만 출력이 되므로 분기가 있을거란걸 예상할 수 있으므로, 이 함수를 호출하는 코드 부분을 감싸고 있는 분기문을 찾으면
이 곳이 되는데 여기가 First Check Routine인 것을 알 수가 있다!
일단, 1분이 지나도 이 코드 부분이 실행되지 않도록 jl을 jmp로 바꿔준다.
//
하지만 이렇게만 했을 경우에는
이런 오류 메세지가 뜨는 것을 볼 수가 있다.
나는 이 때 First Check 코드 부분을 제외하고도 1분이 지났을 때에만 실행이 되는 코드 부분이 있을거라고 생각했고, First Check Routine 밑 코드들 중 의심스러운 모든 분기문에 break point를 사용하여 Second Check Routine와 Third Check Routine를 찾아내었다.
이 두 routine 중 에러 메세지가 출력 되기 전에 실행되는 코드를 break point로 찾아내면, 그 부분이 third check routine인 것을 알 수 있는데
이 부분 또한 아까와 같이 jge를 jmp로 바꾸어준다.
이제 다시 실행해보면 1분이 넘어갔을 때, 프로그램의 타이틀이 Password is LIstenCare로 변한 것을 볼 수 있다! 끝!
'Hack > 리버싱' 카테고리의 다른 글
[CSAW 2017] tablez (0) | 2017.09.20 |
---|---|
[Codegate 2016] compress (0) | 2017.05.20 |
[CodeEngn] Challenges : Basic 01 (0) | 2016.12.20 |
[Reversing.kr] imagePrc (0) | 2016.05.30 |
[Reversing.kr] Easy Unpack (0) | 2016.05.12 |