본문 바로가기

0x00 /0x01 Reversing

- 아주 간단한 Crack me 샘플 분석 (abex' crackme#1)

# abex' crackme #1 분석

 

 


1. 우선 abex' crackme #1  파일이 어떤 동작을 하는지 확인하기 위해 실행 시켜본다.

2. Crack me 파일에서 수정해야 할 부분들을 패치해준다. (조건에 맞도록)

 

 

 

 

[ 그림 1 ] abex' crackme 파일을 실행 시킨 화면 (왼쪽에서 오른쪽으로 순차)

  

- 파일을 실행 시키니까 "Make me think your HD is a CD-Rom"이란 문자열을 포함한 메시지 박스가 뜨고, 확인 버튼을 누르자,

  "Nah... This is not a CD-ROM Drive!" 라는 문자열을 포함한 에러 메시지 박스가 떳다.


- 이 크랙미 문제는 현재 인식하고 있는 하드 디스크를 CD-ROM 드라이브로 인식하게끔 만들어 달라는 문제로 파악이 된다.


- 이제 OllyDbg를 이용하여 파일을 열어보자.

 

 


 

[ 그림 2 ] OllyDbg를 이용하여 Crack me 파일 디버깅

- 우선 위에서 디스어셈 코드를 살펴보면 EP 코드가 짧은 것을 확인할 수 있다. EP 코드가 비교적 짧은 이유는 abex' crackme 파일이 어셈블

  리 언어로 만들어진 실행 파일이기 때문이다. 어셈블리 언어가 아닌 다른 언어로 만들어진 실행 파일일 경우에는 그 언어의 컴파일러가 Stub

  Code를 추가 시키기 때문에 EP 코드가 복잡하게 보이며 길어지게 되는 것이다.


- 위의 디스어셈 코드에서 주의 깊게 살펴 보아야 할 것은 API 함수들, 그리고 점프문이 있는 부분들을 중점으로 봐야한다.

 

* 참고 : Stub Code는 사용자가 입력한 코드가 아니라 컴파일러가 임의로 추가시킨 코드이다. 이 코드는 EP 코드 영역에 추가

          되며, 이러한 코드를 StartUp Code라고 부르기도 한다. 디버깅을 할때엔 자세히 볼 필요가 없다.

 

 


 

[ 그림 3 ] 디스어셈 코드 분석.1

- 위 코드는 EP 코드의 첫 부분에 해당된다. 명령어를 살펴보니 PUSH 명령어를 이용하여 스택에 어떠한 값들을 입력하고 마지막으로 

  MessageBox API 함수를 호출하고 있다. 오른쪽편에 있는 주석부분을 살펴보면 MessageBox API 함수에 전달되는 파라미터에 대한 값들이 

  스택에 입력되고 있다는 것을 알 수 있다.


- 주의해야 할 점은 스택이 FILO(First In Last Out) 구조라서 API 함수에서 참조하는 파라미터의 값들을 역순으로 입력하고 

  있다는 점이다.

 

* 참고 : 위의 디스어셈 코드 5줄을 C언어로 번역하면 아래의 코드와 같다.

            MessageBox(NULL, "Make me think your HD is a CD-Rom.", "abex' 1st crackme", MB_OK|MB_APPLMODAL);    





[ 그림 4 ] 디스어셈 코드 분석.2    (파란 부분: 우리가 원하는 메시지 // 빨간 부분: 기존의 에러메시지)

- 위의 디스어셈코드는 나머지 EP 코드 부분들이다. 쭉 읽어보면, GetDriveTypeA(드라이브 타입을 가져오는 API 함수)를 호출하고, ESI의 값은

  1씩 증가시키고, EAX의 값은 1씩 감소시킨다. 그리고 점프문도 있는데 여기의 점프문은 바로 아래 코드의 주소값을 참조하기 때문에 신경쓸 필요가

  없어 보인다.

   

  중요한 부분은 CMP 명령어를 이용하여 EAX와 ESI의 값을 비교해서 같으면 0040103D 주소로 점프를 하고 같지 않다면 다음 

  코드로 이동하여 진행한다는 부분이다. 0040103D 주소로 이동하면 우리가 원하는 문자열을 가지고 있는 MessageBox를 띄울 

  수 있을 것이다. 따라서 우리가 이 크랙미 문제에서 우리가 해줘야 하는 것은 코드의 흐름이 에러 메시지 박스를 띄우는 곳으로

  가는 것이 아니라, 파란색 부분의 코드로 이동을 하게 해주어야 한다는 것이다.





[ 그림 5 ] Address 0040101F의 어셈 코드 수정

- 위의 JMP 문이 참조하는 주소를 0040103D로 변경하게 되면 우리가 원하는 메시지를 띄울 수 있다.

 

 



[ 그림 6 ] Address 0040101F의 어셈 코드 수정 결과


- 우리가 원했던 의도대로 변경이 됬음을 확인할 수 있다.

 

 

 

* 이 방법 외에도 이 크랙미를 풀 수 있는 방법은 여러 가지가 있을 것이다. EAX와 ESI의 값이 임의로 같아지게 코드를 수정하여 

  기존의 JE 조건을 만족시켜 성공 메시지를 띄우는 방법과 JE 명령어를 JNE 명령어로 변경하여 EAX와 ESI의 값이 다를 때 점프

  하도록 할 수도 있다.




# 참고 도서 : 리버싱 핵심원리