728x90
728x90
728x90

파일 링크: 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(이하 원본파일) 분석해보자.

 

[사진 1]

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

 

 

[사진 2]

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

 

 

[사진 3]

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

 

[사진 4]

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

 

 

[사진 5]

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

 

 

[사진 6]
[사진 7]
[사진 8]

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

 

 

[사진 9]

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

 

 

[사진 10]

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

그래서 "registration", "Registration" 등 문자열을 검색해본 결과 "Registration" 문자열을 검색하면 의미 있는 값들을 찾을 수 있었다.

 

 

[사진 11]

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

 

 

[사진 12]

해당 주소로 가면 성공 메시지와 실패 메시지를 확인할 수 있고 성공 메시지인 "Registration Key accepted!" 문자열이 사용되려면 0x004A5839 주소의 RETN 명령어에 의해 0x004A5841 주소로 점프하도록 해야 하는 것을 알 수 있다.

따라서 추가적으로 윗 부분의 코드들을 분석하여 명령어들을 패치하여 0x004A5839 주소로 프로그램이 실행되도록 하면 된다.

 

코드가 굉장히 길기 때문에 중요한 부분만 보면서 패치해보겠다.

 

 

[사진 13]

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

0x004A51E1 주소의 CALL 명령어로 0x0040524C 함수가 실행되면 리턴 값으로 0x3이 저장되는데 First Name 값의 길이인 것 같다. 그 리턴 값을 TEST 연산 후 0x004A52C0 주소로 점프한다.

 

 

[사진 14]

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

 

 

[사진 15]

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

 

 

[사진 16]

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

 

 

[사진 17]

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

따라서 Registration Key 값을 입력하지 않으면 0x004A53E8 주소로 점프하지 않고 프로그램이 종료된다.

 

 

[사진 18]

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

 

 

[사진 19]

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

 

 

[사진 20]

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

 

 

[사진 21]

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

 

[사진 22]

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

 

 

[사진 23]

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

 

 

[사진 24]

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

 

 

[사진 25]

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

 

 

[사진 26]

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

 

 

[사진 27]
[사진 28]
[사진 29]

위와 같이 등록이 완료되고 상단 바의 "<unregistered>" 문자열도 사라졌다.

728x90
728x90

+ Recent posts