Lena's Reversing for Newbie 12 Write-Up
파일 링크: https://tuts4you.com/e107_plugins/download/download.php?list.17
Downloads / Lenas Reversing for Newbies - Tuts 4 You
tuts4you.com
Tutorials Index: 12. Guiding a program by multiple patching.
사용도구: 올리디버거 2.01
Lena's Reversing for Newbie 12(이하 원본파일) 분석해보자.

원본파일을 실행하면 위와 같은 창이 뜬다. 사용 기간이 5일 남았다고 한다.

그리고 체험판이라는 것을 알려주는데, Continue 버튼을 클릭하면 환경설정? 같은 기능을 하는 것 같다.

프로그램이 실행되면 "<unregistered>" 문자열을 상단 바에서 확인할 수 있다. Help - About 기능을 실행해보자.

그러면 위와 같이 프로그램에 대한 설명과 우측 하단의 버튼을 통해 등록을 할 수 있다.

First Name, Last Name, Registration Key 총 3개의 값을 입력해야 한다.



그런데 Registration Key 값에 따라 메시지가 조금 달라진다. 각각 "1234", "5678", "9999" 값을 입력한 것인데 "is not a valid integer value" 문자열 앞의 값이 달라지는 것을 확인할 수 있다.

먼저 원본파일을 [사진 3]의 상태로 실행한다. 그 다음에 올리디버거의 상단 메뉴 중 File - Attach... 기능을 통해 위와 같이 실행 중인 TechScheduler <standard> <unregistered> 프로세스를 Attach 하면 된다.

그리고 code 섹션에서 우클릭 - Search for - All referenced strings 기능을 클릭하면 위와 같이 사용되는 문자열들을 확인할 수 있다. [사진 6], [사진 7], [사진 8]에서 확인했던 문자열 "is nat a valid integer value" 값을 검색하면 나오지 않는다.
그래서 "registration", "Registration" 등 문자열을 검색해본 결과 "Registration" 문자열을 검색하면 의미 있는 값들을 찾을 수 있었다.

그러면 위와 같이 "Registration Key accepted!" 문자열이 사용되고 있는 것을 확인할 수 있다. 그리고 이외에도 "Enter a ~", "Error! ~" 문자열 등 여러 에러 메시지가 사용되는 것도 확인할 수 있다. "Registration Key accepted!" 문자열이 사용되는 0x004A584B 주소를 살펴보자.

해당 주소로 가면 성공 메시지와 실패 메시지를 확인할 수 있고 성공 메시지인 "Registration Key accepted!" 문자열이 사용되려면 0x004A5839 주소의 RETN 명령어에 의해 0x004A5841 주소로 점프하도록 해야 하는 것을 알 수 있다.
따라서 추가적으로 윗 부분의 코드들을 분석하여 명령어들을 패치하여 0x004A5839 주소로 프로그램이 실행되도록 하면 된다.
코드가 굉장히 길기 때문에 중요한 부분만 보면서 패치해보겠다.

[사진 12]에서 확인했던 0x004A538 주소의 RETN 명령어가 포함된 루틴을 찾는 방법은 윗 부분을 살펴보면 된다. 위와 같이 0x004A51DE 주소부터 루틴이 시작되는 것을 알 수 있는데, 이 곳에 브레이크 포인트를 설정하고 [사진 6] 처럼 프로그램을 실행하면 딱 0x004A51DE 주소에서 중지된다. 입력한 First Name 값 "kim" 문자열도 확인할 수 있다.
0x004A51E1 주소의 CALL 명령어로 0x0040524C 함수가 실행되면 리턴 값으로 0x3이 저장되는데 First Name 값의 길이인 것 같다. 그 리턴 값을 TEST 연산 후 0x004A52C0 주소로 점프한다.

0x004A52C0 주소로 점프하면 "Enter a First Name value now.." 문자열이 사용된다. 따라서 First Name 값을 입력하지 않으면 이 곳으로 점프되고 프로그램이 종료되는 것이다.

다음은 Last Name 값으로 입력한 "test" 문자열과 함께 0x004A52D9 주소의 CALL 명령어로 [사진 13]에서 사용되었던 0x0040524C 함수가 실행된다. 그리고 리턴 값으로 0x4가 저장되고 TEST 연산을 수행한다. 만약 리턴된 EAX 레지스터의 값이 0x0이라면 0x004A53AB 주소로 점프한다.

0x004A53AB 주소로 점프하면 "Enter a Last Name value now.." 문자열이 사용된다. 따라서 Last Name 값을 입력하지 않으면 이 곳으로 점프되고 프로그램이 종료되는 것이다.

다음으로 Registration Key 값으로 입력한 "1234" 문자열과 함께 0x004A53C7 주소의 CALL 명령어로 [사진 13], [사진 15]에서 확인한 0x0040524C 함수가 실행된다. 리턴 값으로 0x4가 저장되고 DEC 명령어로 1 감소시킨 결과가 1 이상이면 0x004A53E8 주소로 점프한다. 점프하지 않으면 "Enter a Key value now.." 문자열을 사용한다.
따라서 Registration Key 값을 입력하지 않으면 0x004A53E8 주소로 점프하지 않고 프로그램이 종료된다.

Step over (F8) 기능으로 분석을 진행하면 0x004A5461 주소의 CALL 명령어로 0x0040A070 함수가 호출된다.

그러면 위와 같이 디버깅을 할 수가 없다.

따라서 위와 같이 NOP 명령어로 패치하여 0x0040A070 함수가 호출되지 않도록 한다.

다음으로 0x004A55E8 주소의 CALL 명령어로 0x00405398 함수가 호출되는데, 실행 후 Z 플래그의 값이 0x0이기 때문에 0x004A5608 주소로 점프하지 않고 "Error! You are attempting ~~" 문자열이 사용된다. 즉, 에러 메시지를 출력하고 프로그램이 종료되는 것이다.

따라서 위와 같이 무조건 0x004A5608 주소로 점프하도록 JMP 명령어로 패치한다.

다음은 0x004A5679 주소의 CALL 명령어로 0x00405398 함수를 실행하고 Z 플래그 값에 따라서 0x004A585F 주소로 점프한다.

0x004A585F 주소로 점프하면 위와 같이 "Registration Key Failed!" 문자열이 출력되고 프로그램이 종료된다.

0x00405398 함수가 실행되면 Z 플래그가 0x0이기 때문에 0x004A585F 주소로 점프된다. 따라서 JNE 명령어를 JE 명령어로 패치하면 우회할 수 있다.

그러면 0x004A5839 주소의 RETN 명령어까지 실행되고 0x004A5841 주소로 이동한 후 "Registration Key accepted!" 문자열과 함께 등록을 할 수 있다.



위와 같이 등록이 완료되고 상단 바의 "<unregistered>" 문자열도 사라졌다.
'Wargame > Lena’s Reversing for Newbies' 카테고리의 다른 글
| Lena's Reversing for Newbie 14 Write-Up (0) | 2019.08.07 |
|---|---|
| Lena's Reversing for Newbie 13 Write-Up (0) | 2019.08.06 |
| Lena's Reversing for Newbie 11 Write-Up (0) | 2019.08.06 |
| Lena's Reversing for Newbie 10 Write-Up (0) | 2019.08.06 |
| Lena's Reversing for Newbie 09 Write-Up (0) | 2019.08.06 |