훈훈훈

abex' crackme #1 풀이 with Python script 본문

정보보안/리버스 엔지니어링

abex' crackme #1 풀이 with Python script

훈훈훈 2018. 11. 5. 01:02


1. 실습환경

- 운영체제 : Windows 7 32bit

- 실습도구 : Immunity Debugger



2. 실습과정

 1) 파일 실행

 : 분석하기 이전에 먼저 파일을 실행시켜 어떻게 동작하는지 확인한다.


<실행화면 - 1>


먼저 파일을 실행했을때 출력되는 메세지 박스이다. 

문제를 풀기 위해서는 HD를 CD-Rom으로 바꿔야한다는 것을 알 수 있다.  


<실행화면 - 2>


<실행화면 - 1>에서 확인 버튼을 클릭하면 다음과 같은 메세지가 출력되는 것을 확인할 수 있다.

아직 HD를 CD-ROM으로 패치하지 않았기 때문에 오류 메세지가 출력되었다.



 2) 파일 분석

 : Immunity Debugger로 해당 파일을 분석을 해보았다.


<분석화면 - 1>


'Immunity Debugger'를 실행시키고 해당 파일을 오픈했을때 코드영역에 다음과 같이 출력된다.

코드가 간결하고 매우 깔끔한걸로 보아 해당 코드는 어셈블리언어로 코딩되었다는 것을 짐작할 수 있다.

위 화면을 보면 많은 API 함수들이 호출된것을 확인할 수 있다. 

그 중에서 빨간 박스로 체크된 'GetDriveTypeA' 함수에 주목하자.

해당 함수는 디스크 드라이브 종류를 결정하는 함수이다. 따라서 해당 함수를 조작함으로서 문제를 해결할 수 있다.


 <GetDriveTypeA 함수 리턴 값>


위 그림은 'GetDriveTypeA' 함수의 리턴 값을 정리한 표이다. 

해당 표는 "https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getdrivetypea" 이 사이트에서 확인할 수 있다.

우리가 원하는 것은 CD-ROM이기 때문에 리턴 값을 5로 설정해줘야하는 것을 알 수 있다.



<분석화면 - 2>


'GetDriveTypeA'를 조작하기 위해 "ctrl + G" 키를 누른 다음 'Kernel32.GetDriveTypeA'를 입력 후 해당 위치로 넘어가자. 


<분석화면 - 3>


해당 위치로 넘어온 후 이제 다음과 같은 위치에서 코드를 수정하자.

'GetDriveTypeA' 함수의 리턴 값은 'EAX'에 저장이 되기 때문에 해당 레지스터에 5 값을 넣어주고 리턴 시키자.


<분석화면 - 4>


위 화면은 이전 화면에서 코드를 수정한 결과이다.

이제 '-(마이너스)' 키를 입력해서 이전 화면으로 넘어간다음 전체 코드를 실행해보자.


<분석화면 - 5>


"00401018" 주소에 BP(Break Point)를 걸고 'F9(run)'를 눌러 해당 주소까지 실행시켜보자.

실행결과 위 화면과 같은 메세지 박스를 확인할 수 있다.


<분석화면 - 6>


그 다음 다시 'F9(run)'을 눌러서 실행해보면 다음과 같이 성공했다는 메세지를 확인할 수 있다.




3. 스크립트

 - Python 코드를 사용하여 해당문제를 해결하는 스크립트를 작성했다.


<Python script>


해당 코드는 변경되는 주소 그리고 변경되는 코드를 담는 변수를 각각 선언한 후 실행하는 코드이다.

이 코드를 실행하기 위해서는 " Immunity INC\Immunity Debugger\PyCommands " 위치에 파일을 저장한 후 

Immunity Debugger 가장 최한단에 있는 입력창에 " ![파일이름] "을 입력하고 실행하면된다.










Comments