티스토리 뷰

Reversing/CodeEngn

abex' crackme #1 분석

Heavy_Rain 2014. 10. 30. 19:22


디버깅을 시작하기전에 파일을 실행시켜 어떤 프로그램인지 살펴 봅니다. 

 

 

 

 

현재 실행해보면

HD 를 CD-ROM 으로 인식하도록 만들라고 합니다.

확인을 누르면 CD-ROM 드라이브가 아니라고 나오네요...

실행해보니 abex crackme1은 CD-ROM 드라이브로 인식하게 만들어주면 되는것 같습니다. 

 

 

 

 

 

CodeWindow 창을 살펴보겠습니다.  

 

 

 





 

 

몇줄 안되네요....

comment 창을 보시면 아까 봤던 출력창의 내용들이 있네요

그 아래 보시면  조금 짤렷지만 YEAH!! "OK, I really think that your HD is a CD-ROM! :p" 라는 문구가 보입니다.

아마도 성공했을때의 메시지로 생각됩니다. 

 

 

 








 

 

 

시작인 401000 번지부터 살펴보겠습니다.

 

 

401002 번지와 401007 번지에서 00402000 번지와 00402012 번지에 있는 abex 1st crackme  ,  Make me think your HD is a CD-Rom 이라는 메시지 박스를 불러와 출력합니다. 

 

401013 번지를 보면 GetDriveTypeA() API 를 이용하여 C드라이브의 타입을 얻어옵니다.

이 부분에서 HD 로 인식되는 부분을 CD-ROM으로 인식하게 하면 될것 같습니다. 

 


 

 

 

 

 

 

 

40101D 번지부터 401024 번지 까지 살펴봅시다.  

 


 

 

※ 이전에 GetDriveTypeA() 에서 리턴값으로 3을 받아옵니다.

이것은 직접 코드를 한 라인씩 진행하면 EAX(리턴값)값으로 3을 받아오는 것을 알 수 있습니다. 

 

 40101D 번지부터 401024 번지 까지 살펴보기 전에 알아야할 몇가지 명령어 입니다.

 

 

 

PUSH              스택에 값을 입력.

 

CALL               지정된 주소의 함수를 호출

 

INC                 값을 증가

 

DEC                 값을 감소

 

JMP                지정된 주소로 점프

 

CMP               주어진 두 개의 operand 비교

 

JE                  조건 분기 (ZF=1 이면 점프) 

 

 

 

 

 

 

 

 

 

 

 

 

 

ESI 증가  =1  

EAX 감소=2

00401021 로 점프 ( 바로  아래 주소가 00401021 이므로 사실 의미 없는 점프문)

ESI 증가 =2

ESI 증가 =3

EAX감소 =1

EAX 와 ESI 비교 (값이 같지 않음) 

 

 

 

  


 



401026 번지에서 두 값이 같으면 0040103D 로 점프 ( 성공 메시지가 출력되게 됩니다.)

만약 두 값이 다르면 조건분기 하지않고 진행. 에러 메시지가 출력되게 됩니다.  

 

 

 

 

 

이제 크래킹을 해봅니다.

 


 

 

방법 1. JE(조건분기)를 JMP 로 변경  

 

 


 

 

저는 JE(조건 분기)를 단순 점프문인 JMP 로 변경해 보겠습니다.

JMP는 무조건 원하는 주소로 이동하므로 성공 메시지가 출력되게 됩니다.  

 

 

 

 







 

 

방법 2. ESI 와 EAX 값을 맞춰 줍니다. 


 

 

 

 




 

 

 

 ESI 의 값과 EAX의 값을 맞추어 주기위해

DEX EAX (EAX를 감소)와 INC ESI(ESI증가) 를 NOP( 값이 없음 )으로 바꿔 줍니다 .

그러면 EAX =2 , ESI= 2로 값이 같아지게 됩니다. 

 

 






방법 1 이나 2번을 수행한 후 실행하면 성공 메시지를 얻을 수 있습니다. 

 

 

 

 

 

 

 

 

 

댓글