2020. 3. 15. 15:15ㆍ보안/리버싱
내용 : abex' Crack Me3 를 분석하고 패치해본다.
1. 분석
keyfile을 확인 하기 위해서는 OK 버튼을 누르라고 지시한다.
일단 시키는 대로 눌러보면
파일을 찾을 수 없다는 Error 창이 뜨게 된다.
이후 OK를 누르면 종료된다.
2. OllyDbg로 디버깅하기
[F9]를 이용하여 메시지 박스를 호출하는 부분으로 타고 들어왔다.
우선 00401002 번지 주소를 보면 맨 처음 프로그램을 실행시키면 나오는 메시지 박스를 호출하는 부분이 보이고,
그 아래 CreateFileA 라는 API 가 호출되는 것을 볼 수 있다.
처음보는 API이므로 검색을 해보았다.
HANDLE CreateFileA(
LPCSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
위와 같은 원형을 가진 CreateFileA API는 이름 그대로 파일을 생성 및 실행하는 함수이다.
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea
CreateFileA function (fileapi.h) - Win32 apps
Creates or opens a file or I/O device. The most commonly used I/O devices are as follows:\_file, file stream, directory, physical disk, volume, console buffer, tape drive, communications resource, mailslot, and pipe.
docs.microsoft.com
자세한 내용은 마이크로스프트 docs 에서 확인할 수 있다.
CreateFileA 옆에 나온 정보를 토대로 메모장을 이용하여 같은 파일 안에 abex.l2c 라는 이름의 파일을 하나 생성했다.
파일을 찾을 수 없다는 에러 대신 유효한 키 파일이 아니라는 에러가 나왔다.
파일의 흐름을 직관적으로 하기위해 IDA를 이용하였다.
1. 처음 시작하면 나오는 부분 / CreateFileA 를 호출하는 부분
2. GetFileSize 를 이용하여 키 파일의 사이즈를 확인하는 부분
3. 키 파일의 사이즈를 비교하여 비교된 값이 유효할 때 ("Yep, keyfile found!")
4. 키 파일의 사이즈를 비교하여 유효하지 않은 키 파일인 경우 ("The found file is not a valid keyfile")
5. CreateFileA 실행에 있어 파일이 없다고 판단된 부분 ("Hmmmm, I Can't find the file!')
6. 파일 종료
즉 유효한 키 파일이 아니어서 발생하는 에러는 파일의 사이즈 확인 이후 조건에 충족되지 않아 나온 오류라고 판단 할 수 있다.
GetFileSize API를 호출하고 아래에 CMP 명령어를 보면 반환된 값과 12를 비교하여
JNZ 00401060 # ZF가 0이 아닐때, 즉 비교한 값이 같지 않을 때
유효한 키파일이 아니라는 텍스트를 출력하는 부분으로 넘기는 것을 알 수 있다.
3. 풀이
여러가지 방법을 생각해 보았다.
우선 점프 주소를 바로 정답인 곳으로 점프 시켜버리기
다음으로 파일의 크기를 10진수 18로 만들어서 다시 시도하기.
마지막으로 비교 조건을 12가 아닌
CMP EAX, EAX
조건으로 변경하여 항상 정답으로 넘기기
풀이는 마지막 방법을 통해 진행하였다.
위와 같이 진행하면 아래의 조건이 성립하지 않게 되면서 오류를 뿜어내는 메시지 박스로 점프하지 않게 되어 정답을 출력하게 된다.
'보안 > 리버싱' 카테고리의 다른 글
[Reversing] 리버싱 핵심원리 [12]. PE 헤더 1 (0) | 2020.04.02 |
---|---|
[Reversing] 리버싱 핵심원리 [11]. abex' Crack Me 4 풀이 (0) | 2020.03.15 |
[Reversing] 리버싱 핵심원리 [9]. Lena's Reversing for Newbies 1 (1) | 2020.03.12 |
[Reversing] 리버싱 핵심원리 [8]. 함수 호출 규약 (0) | 2020.03.03 |
[Reversing] 리버싱 핵심원리 [7 - 2]. abex' 2nd crackme 풀이 - 시리얼코드 생성 함수 분석 (0) | 2020.03.02 |