처음으로 "Reverse Engineering" 에 포스팅을 하게 되네요~
앞으로 얼마간은 Crack 과 관련된 포스팅을 하게될 듯 합니다.
처음 타겟은
Abex's CrackMe 시리즈입니다.
제가 회사에 입사하고 나서 얼마간 업무파악을 못한 상태에서~~
빈둥거리며 연습삼아 하게된 것들인데요...^^;;ㅋ
Crack 세계에 막 입문하시려는 분들에게 좋은 연습자료가 될거라 생각합니다...ㅋ
Abex's CrackMe 시리즈는 총 5개구요.. 오늘은 그 중 1번을 타켓으로 잡았습니다.
( 총 시리즈가 5개이니 앞으로 4번의 포스팅에 대해선~ 뭘할까..? 하는 고민을 없애기위한
=0=;;;.. 놀고먹으려는 의도가 강하긴 합니다...ㅋㅋ :D )
우선~ 위의 abex1.zip 파일을 다운로드 받으셔서 원하는 폴더에 압축을 풉니다~
abexcm1.exe 파일이 있을텐데요~ 악성코드나 그런거 아니니 안심하고 실행시켜 봅니다~
위와 같은 대화상자가 하나 뜰겁니다~ㅋ
"확인"을 눌러볼까요...?
음... CD-ROM 드라이브가 아니라고 하는군요.. =0=;;;
여기서 이번 작업의 목적이 뭘까~~? 하고 생각을 할 수 있는데...
abexcm1.exe 파일을 적당히 뜯어고쳐서...우리의 하드 디스크를 CD-ROM 으로 인식하게끔 해서
CD-ROM 이네요~~ 하고 메시지박스를 띄우도록 바꾸는게 목적입니다.
본격적인 작업에 시작하기 전에~~ 사용할 도구를 준비해야 되는데...
저는
Olly Debugger 를 사용합니다. 유저모드 디버거 중에선 최고가 아닐까~~ 생각되는;;ㅋ
참고로
Olly Debugger 는
http://www.ollydbg.de 에서 받으실 수 있습니다.
그리고
http://www.tuts4you.com 에서 각종 변형들과 스크립트, 플러그인 등을 받으실 수 있습니다.
이제... 도구가 준비되었으면~ 본격적으로 작업을 시작해볼까요..?
먼저.. 올리로
abexcm1.exe 파일을 열어봅니다. ( 아래 이미지 클릭강추~ㅋ )
abexcm1.exe on OllyDBG
위의 내용이 abexcm1.exe 의 전부입니다. (워낙에 단순한 프로그램인지라...)
전체적인 흐름은 아래와 같습니다.
1. "Make me think your HD is a CD-Rom" 메시지를 띄운다.
2. GetDriveTypeA API 함수를 호출한다. (인자는 "c:\")
3. 함수 실행 결과를 바탕으로 비교연산을 수행한다. (CD-ROM인지 아닌지...)
4. CD-ROM 이면 CD-ROM이라는 메시지박스를, 아니면 아니라는 메시지박스를 띄운다.
5. 프로그램 종료.
"하드디스크를 CD-ROM 으로 인식하게끔 하라..."
직관적으로 3. 의 과정을 건드려야 되겠구나~~ 하고 생각되면 Goooooooooooood 입니다.
3. 과정의 비교연산을 수행하는 부분을 건드려서 하드디스크를 CD-ROM 으로 인식하게끔 하면 됩니다.
3. 과정에 해당되는 부분은 아래의 코드입니다.
GetDriveTypeA 호출 후 비교연산 수행
GetDriveTypeA 함수를 호출하게 되면 그 리턴값이 EAX 에 저장됩니다.
"C:\" 를 인자로
GetDriveTypeA 를 호출하면 "3" 을 리턴하게 됩니다. (아래 이미지 참조)
GetDriveTypeA 함수실행 후 레지스터의 값
비교연산을 할 때, INC, DEC 등의 명령을 ESI, EAX 레지스터를 대상으로 하고 있는데...
( 참고로 INC 는 1증가, DEC 는 1감소 시키는 명령입니다.)
아래의 연산루틴을 타게되면 해당 레지스터의 값이 조금 바뀌게 됩니다.
0040101D INC ESI ;---> ESI : 00000000
0040101E DEC EAX ;---> EAX : 00000002
0040101F JMP SHORT abexcm1.00401021
00401021 INC ESI ;---> ESI : 00000001
00401022 INC ESI ;---> ESI : 00000002
00401023 DEC EAX ;---> EAX : 00000001
00401024 CMP EAX, ESI ; EAX, ESI 값을 비교
00401026 JE SHORT abexcm1.0040103D
CMP 명령의 연산결과에 따라 EAX와 ESI 값이 같으면 0040103D로 점프를 하고,
값이 다르면 JE 명령이 수행된 00401026의 바로 다음 번지(00401028)에서 실행이 계속 됩니다.
맨~~위의 전체코드를 보면 아시겠지만... 00401028 번지는 CD-ROM이 아니라는 메시지박스를 띄우는 부분이고,
0040103D 번지는 우리가 원하던~ CD-ROM 이구나~~ 하는 메시지박스를 띄우는 부분입니다.
정리하면, EAX와 ESI의 값이 같으면 CD-ROM 으로 인식을 한다는 것입니다.
이제 다 왔습니다...
위의 코드에서는 EAX와 ESI값이 같다는 조건하에 CD-ROM 이라는 메시지박스를 띄우는 번지로
조건분기(JE 명령)를 하도록 되어있습니다.
이 때, 조건을 무의미하게 하려면 어떻게 하면 될까요...? ^^:;
조건에 상관없이 분기... 즉 무조건 분기, JMP 명령을 이용하면 됩니다.
00401026 JE SHORT abexcm1.0040103D 이 부분을
00401026
JMP SHORT abexcm1.0040103D 로 바꿔주면 됩니다.
이러면 CMP명령의 연산 결과(EAX와 ESI값이 같은지의 여부)에 상관없이 무조건...
CD-ROM 이라고 인식을 하는 메시지박스를 띄우게 됩니다.
.
.
어렵지는 않은 내용인데.. =0= 어쩌다보니.. 굉장히 길어졌군요;;;;;
다음에는 Lv2 에 대한 내용을 올리도록 하겠습니다..ㅋ