Lena's Reversing for Newbies #10 (1)
* 출처 : http://www.tuts4you.com/download.php?view.131
Level
초급
abstract
crackme 샘플을 분석합니다.
Lena's Reversing for Newbies
리버싱 초보자를 위하여 Lena 라는 사람이 www.tuts4you.com 게시판에 40 개의 crackme 강좌를 올려놓았습니다.
이 강좌는 매우 큰 인기를 끌었는데요, 그 이유는 모든 강좌에 대해 플래시 동영상으로 친절하게 설명해주기 때문입니다.
나중에 tuts4you 에 접속하셔서 동영상 강좌를 보시면, 리버싱 공부에 큰 도움이 될 것입니다.
실행
* 실행에 앞서 www.virustotal.com 에서 악성 파일 검사 해보는 습관을 들입시다.
제공되는 파일은 제가 미리 검사를 마친 (안전이 검증된) 파일입니다.
크랙하려는 파일을 먼저 한번 실행해 봅니다.
우선 메시지 박스가 뜨면서 2 가지를 지시합니다.
- 모든 성가신 잔소리(?)를 없애라.
- registration code 를 찾아라.
[확인] 을 선택하면 아래와 같은 메인 윈도우가 나타납니다.
<Fig. 2>
전형적인 serial crackme 입니다.
화면의 파란 글씨를 읽어보면 registration 을 위해 "SmartCheck" 를 사용하라는군요.
SmartCheck 란 Numega 사에서 만든 유틸리티이며 크래커들이 애용하는 툴 중에 하나입니다.
(저는 굳이 사용할 필요를 못 느끼겠네요. ^^ 전 OllyDbg 가 좋습니다.)
목표 #1 - 메시지 박스 제거!
첫번째 목표인 nag (잔소리?) 메시지를 제거해 보겠습니다.
<Fig. 1> 의 메시지 박스를 얘기하는 것인데요,
이것은 프로그램 시작할 때와 <Fig. 2> 에서 [Nag?] 버튼을 눌렀을 때 나타납니다.
OllyDbg 로 파일을 열어봅니다.
<Fig. 3>
<Fig. 4>
<Fig. 4> 에서 "Destination" 칼럼을 선택해서 정렬시키면 함수 이름 순으로 정렬이 됩니다.
우리가 찾는 rtcMsgBox 함수는 총 4 군데에서 호출되는군요.
마우스 우측 버튼 메뉴의 Set breakpoint on every call to rtcMsgBox 메뉴를 선택하시면
아래 그림과 같이 rtcMsgBox 를 호출하는 모든 코드에 BP 가 설치됩니다.
<Fig. 5>
이 상태로 디버거에서 프로그램을 실행 시킵니다. [F9]
BP 설치된 곳에서 실행이 멈췄습니다.
402CFE 주소에서 실행이 멈췄는데요, 위로 조금 스크롤을 올려보면 <Fig. 1>에서 봤던 메시지 박스의 문자열이 보입니다.
이 부분이 바로 프로그램 시작할 때 나타나던 메시지 박스를 출력하는 코드 부분입니다.
제대로 찾아 왔습니다.
계속 실행[F9]을 시켜보면 <Fig. 1> 의 메시지 박스가 출력되고,
[확인] 버튼을 선택하면 <Fig. 2> 의 메인 화면이 나타납니다.
여기서 [Nag?] 버튼을 눌러볼까요?
<Fig. 6> 와 같은 주소 (402CFE) 에서 실행이 멈추게 됩니다.
처음 나타나는 메시지 박스와 메인 화면의 [Nag?] 버튼을 통한 메시지 박스 모두 같은 코드에서 실행이 되고 있었습니다.
한 군데만 패치하면 되겠군요.
패치 #1 - 메시지 박스 제거
패치 하는 방법은 여러가지가 있을 수 있습니다.
전 처음에 402CFE 주소의 CALL 명령을 아래와 같이 수정했었습니다.
(원본)
00402CFE E8 1DE4FFFF CALL <JMP.&MSVBVM50.#595> ; <= rtcMsgBox()
(수정)
00402CFE 83C4 14 ADD ESP,14 ; 스택정리
00402D01 90 NOP ; No Operation
00402D02 90 NOP ; No Operation
ADD ESP, 14 명령의 의미는 rtcMsgBox() 에 전달되는 파라미터의 크기(14)만큼 스택을 정리해주는 명령입니다.
(Calling Convention 을 참고하세요)
그리고 나머지 2 byte 만큼 NOP 로 채워서 코드가 깨지지 않도록 하였습니다.
(원래 CALL 명령어의 크기는 5 byte 였죠. ADD 명령어 3 byte 를 쓰고 나면 2 byte 가 남게 되죠.)
문제가 없어 보였으나 결과는 '에러발생' 이었습니다.
뭔가 다른 방법을 사용해야 겠군요.
<Fig. 6> 의 코드에서 스크롤을 조금 더 올려보겠습니다.
<Fig. 7>
402C17 주소에 함수 시작에 나타나는 스택 프레임의 prologue 가 보입니다.
(Stack Frame 을 참고하세요.)
402CFE 의 rtcMsgBox 함수 호출 코드 역시 다른 함수 내부에 속해 있는 코드입니다.
따라서 상위 함수를 호출 하지 못하게 하거나 아니면 바로 리턴해버리면 결국 rtcMsgBox 함수는 호출되지 않을 것입니다.
402C17 명령어를 아래와 같이 수정합니다. (둘 다 1 byte 명령어 입니다.)
(원본)
00402C17 55 PUSH EBP
(수정)
00402C17 C3 RETN ; 바로 리턴
* 주의 : 이 경우는 함수에 전달된 파라미터가 없기 때문에 RETN 이 가능하지만,
만약 파라미터가 있었다면 그만큼 스택을 보정(RETN XX)해줘야 합니다.
이로써 간단하게 메시지 박스를 제거하였습니다.
(continue)
* 출처 : http://www.tuts4you.com/download.php?view.131
Level
초급
abstract
crackme 샘플을 분석합니다.
Lena's Reversing for Newbies
리버싱 초보자를 위하여 Lena 라는 사람이 www.tuts4you.com 게시판에 40 개의 crackme 강좌를 올려놓았습니다.
이 강좌는 매우 큰 인기를 끌었는데요, 그 이유는 모든 강좌에 대해 플래시 동영상으로 친절하게 설명해주기 때문입니다.
나중에 tuts4you 에 접속하셔서 동영상 강좌를 보시면, 리버싱 공부에 큰 도움이 될 것입니다.
실행
* 실행에 앞서 www.virustotal.com 에서 악성 파일 검사 해보는 습관을 들입시다.
제공되는 파일은 제가 미리 검사를 마친 (안전이 검증된) 파일입니다.
크랙하려는 파일을 먼저 한번 실행해 봅니다.
<Fig. 1>
우선 메시지 박스가 뜨면서 2 가지를 지시합니다.
- 모든 성가신 잔소리(?)를 없애라.
- registration code 를 찾아라.
[확인] 을 선택하면 아래와 같은 메인 윈도우가 나타납니다.
<Fig. 2>
전형적인 serial crackme 입니다.
화면의 파란 글씨를 읽어보면 registration 을 위해 "SmartCheck" 를 사용하라는군요.
SmartCheck 란 Numega 사에서 만든 유틸리티이며 크래커들이 애용하는 툴 중에 하나입니다.
(저는 굳이 사용할 필요를 못 느끼겠네요. ^^ 전 OllyDbg 가 좋습니다.)
목표 #1 - 메시지 박스 제거!
첫번째 목표인 nag (잔소리?) 메시지를 제거해 보겠습니다.
<Fig. 1> 의 메시지 박스를 얘기하는 것인데요,
이것은 프로그램 시작할 때와 <Fig. 2> 에서 [Nag?] 버튼을 눌렀을 때 나타납니다.
OllyDbg 로 파일을 열어봅니다.
<Fig. 3>
눈에 익은 코드 형태입니다.
바로 지난번 abex' crackme 02 에서 봤던 Visual Basic 코드입니다.
(00401162 주소의 MSVBVM50.ThunRTMain 함수가 보이시죠?)
예측을 해볼까요?
메시지 박스를 제거하기 위해서는 메시지 박스 호출 부분을 조작하면 될 것 같습니다.
Visual Basic 에서 메시지 박스 출력함수는 MSVBVM50.rtcMsgBox 함수입니다.
OllyDbg 에서 마우스 우측 버튼 메뉴의 Search for - All intermodular calls 명령을 사용하면
아래와 같이 프로그램에서 사용되는 API 호출 목록이 나타납니다.
바로 지난번 abex' crackme 02 에서 봤던 Visual Basic 코드입니다.
(00401162 주소의 MSVBVM50.ThunRTMain 함수가 보이시죠?)
예측을 해볼까요?
메시지 박스를 제거하기 위해서는 메시지 박스 호출 부분을 조작하면 될 것 같습니다.
Visual Basic 에서 메시지 박스 출력함수는 MSVBVM50.rtcMsgBox 함수입니다.
OllyDbg 에서 마우스 우측 버튼 메뉴의 Search for - All intermodular calls 명령을 사용하면
아래와 같이 프로그램에서 사용되는 API 호출 목록이 나타납니다.
<Fig. 4>
<Fig. 4> 에서 "Destination" 칼럼을 선택해서 정렬시키면 함수 이름 순으로 정렬이 됩니다.
우리가 찾는 rtcMsgBox 함수는 총 4 군데에서 호출되는군요.
마우스 우측 버튼 메뉴의 Set breakpoint on every call to rtcMsgBox 메뉴를 선택하시면
아래 그림과 같이 rtcMsgBox 를 호출하는 모든 코드에 BP 가 설치됩니다.
<Fig. 5>
이 상태로 디버거에서 프로그램을 실행 시킵니다. [F9]
BP 설치된 곳에서 실행이 멈췄습니다.
<Fig. 6>
402CFE 주소에서 실행이 멈췄는데요, 위로 조금 스크롤을 올려보면 <Fig. 1>에서 봤던 메시지 박스의 문자열이 보입니다.
이 부분이 바로 프로그램 시작할 때 나타나던 메시지 박스를 출력하는 코드 부분입니다.
제대로 찾아 왔습니다.
계속 실행[F9]을 시켜보면 <Fig. 1> 의 메시지 박스가 출력되고,
[확인] 버튼을 선택하면 <Fig. 2> 의 메인 화면이 나타납니다.
여기서 [Nag?] 버튼을 눌러볼까요?
<Fig. 6> 와 같은 주소 (402CFE) 에서 실행이 멈추게 됩니다.
처음 나타나는 메시지 박스와 메인 화면의 [Nag?] 버튼을 통한 메시지 박스 모두 같은 코드에서 실행이 되고 있었습니다.
한 군데만 패치하면 되겠군요.
패치 #1 - 메시지 박스 제거
패치 하는 방법은 여러가지가 있을 수 있습니다.
전 처음에 402CFE 주소의 CALL 명령을 아래와 같이 수정했었습니다.
(원본)
00402CFE E8 1DE4FFFF CALL <JMP.&MSVBVM50.#595> ; <= rtcMsgBox()
(수정)
00402CFE 83C4 14 ADD ESP,14 ; 스택정리
00402D01 90 NOP ; No Operation
00402D02 90 NOP ; No Operation
ADD ESP, 14 명령의 의미는 rtcMsgBox() 에 전달되는 파라미터의 크기(14)만큼 스택을 정리해주는 명령입니다.
(Calling Convention 을 참고하세요)
그리고 나머지 2 byte 만큼 NOP 로 채워서 코드가 깨지지 않도록 하였습니다.
(원래 CALL 명령어의 크기는 5 byte 였죠. ADD 명령어 3 byte 를 쓰고 나면 2 byte 가 남게 되죠.)
문제가 없어 보였으나 결과는 '에러발생' 이었습니다.
뭔가 다른 방법을 사용해야 겠군요.
<Fig. 6> 의 코드에서 스크롤을 조금 더 올려보겠습니다.
<Fig. 7>
402C17 주소에 함수 시작에 나타나는 스택 프레임의 prologue 가 보입니다.
(Stack Frame 을 참고하세요.)
402CFE 의 rtcMsgBox 함수 호출 코드 역시 다른 함수 내부에 속해 있는 코드입니다.
따라서 상위 함수를 호출 하지 못하게 하거나 아니면 바로 리턴해버리면 결국 rtcMsgBox 함수는 호출되지 않을 것입니다.
402C17 명령어를 아래와 같이 수정합니다. (둘 다 1 byte 명령어 입니다.)
(원본)
00402C17 55 PUSH EBP
(수정)
00402C17 C3 RETN ; 바로 리턴
* 주의 : 이 경우는 함수에 전달된 파라미터가 없기 때문에 RETN 이 가능하지만,
만약 파라미터가 있었다면 그만큼 스택을 보정(RETN XX)해줘야 합니다.
이로써 간단하게 메시지 박스를 제거하였습니다.
(continue)