훈훈훈
abex' crackme #1 풀이 with Python script 본문
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 가장 최한단에 있는 입력창에 " ![파일이름] "을 입력하고 실행하면된다.
'정보보안 > 리버스 엔지니어링' 카테고리의 다른 글
abex' crackme #4 풀이 with Python script (0) | 2018.11.09 |
---|---|
abex' crackme #3 풀이 with Python script (0) | 2018.11.05 |
abex' crackme #2 풀이 with Python script (0) | 2018.11.05 |