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