훈훈훈

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

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

abex' crackme #3 풀이 with Python script

훈훈훈 2018. 11. 5. 17:23


1. 실습환경

- 운영체제 : Windows 7 32bit

- 실습도구 : Immunity Debugger



2. 실습과정

 1) 파일 실행

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


<실행화면 - 1>


해당 파일을 실행시켰을때 출력되는 메시지 박스를 해석해보면 "keyfile"을 체크해서 문제를 해결하는 

로직인것을 알 수 있다. 


<실행화면 - 2>


이전 메시지 박스에서 "확인"을 클릭했을때 "유효한 keyfile" 찾을 수 없다는 메시지가 출력된다.

따라서 문제를 해결하기 위해서는 "조건에 맞는 keyfile" 이 필요하다는걸 알 수 있다.

하지만 지금 우리가 하는 과정은 역공학이기 때문에 파일은 생성하지 않고 코드 조작으로 문제를 해결할것이다.



 2) 분석 과정

 : "Immunity Debugger" 를 이용하여 해당 파일을 분석해보았다.


<분석화면 - 1>


"Immunity Debugger" 로 해당 파일을 오픈했을때 가장 먼저 출력되는 코드영역 화면이다.

코드 영역을 자세히 살펴보면 여러 API 함수들이 호출되는 것을 확인할 수 있다.

빨간색 박스에 있는 "CreateFileA" 함수로 문제에서 요구하는 파일( File Name :"abex.l2c" )을 오픈하는 것을 알 수 있다.

이 함수에 대한 자세한 설명은 MSDN에 있는 설명을 자세히 읽어보길 바란다.


참고 "https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea"


<분석화면 - 2>


위 화면에서는 "GetFileSize" 함수를 볼 수 있다.

함수 호출이 끝나고 "CMP EAX, 12" 코드를 볼 수 있다.

따라서 함수 호출이 끝난 다음 반환된 값이 "EAX" 에 저장된다음 0x12 값과 비교를 통해

참이면 성공 메시지 출력 실패시 에러 메시지가 출력되는 것을 알 수 있다.


참고 "https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfilesize"


<분석화면 - 3>


따라서 "Ctrl + G" 키를 입력 후 "kernel32.GetFileSize"를 입력한다. 그 다음 해당 위치로 이동한다음 코드를 변경해주면 

문제가 해결된다.


<분석화면 - 4>


함수 호출이 끝나고 0x12 값과 비교하기 때문에 코드를 "MOV EAX, 12" 변경 후  그 다음 코드를 "RETN" 값을 입력한다.


<분석화면 - 5>


코드를 변경 후 "-(마이너스)" 키를 이용해서 이전 코드로 되돌아온 다음 0x401041 주소에 BP(Break Point)를 세팅한 다음

F9(run)키를 눌러 실행시키자.


<분석화면 - 6>


BP가 걸린 위치까지 실행된 다음 다시 실행시키면 성공 메세지가 출력된 것을 확인할 수 있다.


3. 스크립트

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


<Python Script>


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

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

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
















Comments