-
[Lenas Reversing for Newbies] 05Wargame/Lenas Reversing 2021. 1. 30. 19:36
1. 프로그램 실행
첨부 파일인 VisualSite Designer.exe를 실행해보자.
실행 화면1 위와 같이 메인 윈도우가 나타나기 전에 위와 같은 위도우가 나타난다. 온라인으로 등록되기 전에는 위와 같이 trials 횟수가 표시되며 한 번 실행할 때마다 횟수가 차감된다. 10번 이후에는 다음과 같이 등록하라는 문구가 나타난다.
실행 화면2 화면이 잘려서 잘 안 보이지만 실행 화면 1의 하단 오른쪽에는 "Start Program" 버튼이 있다. 해당 버튼을 눌러 프로그램을 실행해보자.
실행 화면3 웹 디자인 용 프로그램이라고 한다. X 버튼을 눌러 프로그램을 종료해보자.
실행 화면4 다른 체험판 프로그램들과 비슷하게 이런저런 광고 창이 나타난다. 이번 패치의 목표는 앞의 trial 카운트를 나타내는 nag 제거, 프로그램을 종료했을 때 나타나는 광고창 nag 제거다.
2. Debugging(with OllyDbg)
(1) 앞의 trial count nag 제거
우선은 어느 부분을 패치할지를 파악하기 위해 trial count 윈도우가 나타나는 시점을 찾아야 한다. 이를 위해 Ctrl+F8로 Animate Over 기능을 이용하고 trial count 윈도우가 나타나는 코드에 BP를 설정하고 해당 부분에서 F7로 step in 하는 작업을 반복하여 정확한 윈도우 발생지점을 탐색한다. 이 작업을 하다 보면 아래와 같은 코드를 확인할 수 있다.
디버깅 1 해당 지점에서 똑같이 안으로 들어가게 되면 MFC42 모듈의 코드들이 나열되어 있는 것을 확인할 수 있는데 그중 다음과 같은 코드들을 주목해보자.
디버깅 2 위 코드들은 API() 들을 호출하는 것으로 이미 trial 윈도우를 화면에 출력하기 위한 코드들임을 추측할 수 있다. 따라서 디버깅 1 화면의 00489912 주소를 기준으로 코드를 살펴보는 것이 좋을 것 같다. 00489912 주소를 기준으로 조금 스크롤을 올려보면 위와 같은 conditional jump 명령어를 확인할 수 있다.
디버깅 3 만약 해당 지점에서 점프를 하게 된다면 BP를 설정해놓은 00489912 부분은 코드가 실행되지 않아 trial 윈도우가 출력되지 않는다. Ctrl+F2를 눌러 프로그램을 재실행한 후, 해당 지점에서 zero flag를 반전시켜 점프를 했을 때 어떤 결과가 나타나는지 확인해보자.
점프 결과 위와 같이 해당 부분에서 점프를 하게 되면 바로 Trial period expired라는 문구가 출력되는 것을 확인할 수 있다. 해당 JLE 명령어 위쪽에서 조건을 체크하는 코드 부분을 살펴보자.
조건 검사 JLE 위로는 TEST EAX, EAX 명령어가 보이며 EAX 레지스터에는 EDI+E4 주소에 담겨있는 값이 옮겨진다. dump 창에서 해당 주소에 담겨있는 값을 확인해보면 남은 trial count라는 것을 확인할 수 있다. 만약에 남은 trial count가 0이 될 경우 TEST EAX, EAX에 의해 zero flag가 세팅되고 점프하게 되는 것이다. 해당 부분은 tiral 윈도우를 제거하는 부분은 아니니, 조금 더 스크롤을 위로 올려서 또 다른 conditional jump를 살펴보자.
두 번째 conditional jump 위와 같이 두 번째 conditional jump가 나타난 것을 확인할 수 있다. 똑같이 해당 부분에서 zero flag를 반전시켜 프로그램을 실행시킬 경우 어떤 결과가 나타나는지 확인해보자.
프로그램 실행 trial 윈도우 없이 바로 프로그램이 실행되는 것을 확인할 수 있다. 두 번째 conditional jump 명령어 부분에서 점프를 하게 되면 trial 윈도우가 출력되지 않는다는 것을 확인하였으니 해당 부분을 JNZ 대신 JMP로 수정한 후 copy to executable을 통해 파일로 저장하자.
(2) 프로그램 종료 시 출력되는 광고 nag 제거
OllyDbg로 패치한 VisualSite Designer 프로그램을 열고 F9를 눌러 실행한 후, 프로그램을 종료하면 광고창이 나타난다. 이때 OllyDbg에서 Pause를 한 후, Call Stack(상단 K버튼)을 눌러보자.
Call Stack 유저 영역에서 호출된 부분 중 가장 최근 부분인 체크 표시된 곳을 더블 클릭하여 이동한 후, 해당 지점에 BP를 설정하고 다시 실행해보면 광고창이 나타나는 부분임을 알 수 있다. 00480C24 호출 전후로 스택 값이 변화가 없으므로 단순히 NOP으로 패치해주면 성공적으로 광고창을 제거할 수 있다.
3. Comment
VisualSite Designer는 MFC로 제작된 프로그램으로 아무래도 일반 콘솔 프로그램보다는 디버깅하기 까다로운 프로그램이다. 이번 문제를 통해 기본적인 패치 지점에 대한 여러 가지 팁(Conditional jump 등등)들을 알 수 있었고, Call stack 창을 활용하는 방법도 배울 수 있었다. 또한 이번 문제를 풀면서 BP를 설정할 때 프로그램 영역에는 문제없이 software BP를 설치할 수 있었지만 dll 부분에는 설치하자마자 바로 풀리는 현상이 있었다. 아마도 software BP 방식이 해당 코드의 앞부분을 0xCC로 바꾸어주는 방식인데 dll에 이렇게 적용해버리면 다른 프로세스에서 dll을 이용할 때 문제가 발생할 수도 있기 때문인 것 같다. 이를 해결하기 위해 hardware bp를 이용하는 방법을 적용하였는데 리버싱 핵심원리 책을 공부할 때와는 또 다른 상황에서의 hardware bp 적용이었다.
반응형'Wargame > Lenas Reversing' 카테고리의 다른 글
[Lenas Reversing for Newbies] 07 (0) 2021.02.01 [Lenas Reversing for Newbies] 06 (0) 2021.02.01 [Lenas Reversing for Newbies] 04 (0) 2021.01.29 [Lenas Reversing for Newbies] 03 (0) 2021.01.28 [Lenas Reversing for Newbies] 02 (0) 2021.01.26