사용된 디버거 : x64dbg (https://sourceforge.net/projects/x64dbg/files/snapshots/)

디버깅 환경 : Windows 10 64bit


x64dbg를 이용할 경우 "이 파일을 디버깅하기 위해서 x32dbg를 사용합니다!" 라는 문구와 함께 해당 파일을 오픈할 수 없으므로 x32dbg를 이용하여 파일을 오픈합니다.


파일을 오픈한 뒤 F9를 눌러 프로그램을 실행시켜줍니다.


crackme3.exe의 Entry Point는 00401000입니다.

프로그램의 시작과 함께 스택에 MessageBoxA 함수에 들어갈 인자를 채웁니다.

push 0                                                                                                           <<uType MB_OK

push crackme3.402000                    402000:"abex' 3rd crackme"                               <<lpCaption

push crackme3.402012                    402012:"Click OK to check for the keyfile."            <<lpText

push 0                                                                                                           << hWnd

call <crackme3.MessageBoxA>        

스택은 FILO 구조로 이루어져 있으므로 원형 순서의 반대로 대입합니다.

오른쪽 아래 스택 프레임 화면을 보면 정상적으로 대입된것을 확인할 수 있습니다.


push 0                                 | TemplateFile

push 80                                | FlagsAndAttributes

push 3                                 | CreationDisposition

push 0                                 | SecurityAttributes

push 0                                 | ShareMode

push 80000000                          | DesiredAccess

push crackme3.4020B9                   | 4020B9:"abex.l2c" File Name

call <crackme3.CreateFileA>            

CreateFileA 함수를 이용하여 "abex.l2c" 라는 key 파일을 오픈합니다.


지금은 "abex.l2c" 라는 파일이 존재하지 않으므로 EAX가 FFFFFFFF으로 변경되었습니다.

cmp eax, FFFFFFFF

je crackme3.401075 << 이곳에서 점프를 진행합니다.

점프 결과 파일을 찾을 수 없다는 메시지를 띄운 뒤 ExitProcess 함수를 통해 프로그램이 종료됩니다.


필요한 key 파일의 이름을 알았으니 crackme3.exe와 같은 위치에 "abex.l2c" 라는 파일을 만들고, Ctrl + F2를 눌러 프로그램을 다시 로드해준 뒤 Call CreateFileA 까지 진행하면 EAX의 값이 2F0으로 변경된 것을 확인할 수 있습니다.


cmp 구문을 쉽게 통과하였지만 GetFileSize라는 함수가 우리를 기다리고있습니다.

0040102F 에서 mov dword ptr ds:[4020CA],eax 구문을 통해 eax의 값을 4020CA의 값으로 복사하였고

0040103B 에서 GetFileSize에 필요한 인자로 스택에 넣어주어 "abex.l2c" 파일의 크기를 확인한 뒤 eax에 대입합니다.

방금 우리가 만든 key 파일은 아무 내용도 적혀있지 않은 파일이므로

00401049 의 분기점에서 점프를 진행, The found file is not a valid keyfile 이라는 메시지를 호출하게 됩니다.


파일의 크기는 바로 윗줄인

00401046 에서 cmp eax, 12 로 비교를 진행하고있습니다. hex의 12는 Decimal의 18이므로 쓰레기값으로 18바이트를 채워준 뒤 프로그램을 다시 로드합니다.


* 주의할 점 : 한글은 한 글자에 2byte를 차지하기 때문에 한글을 이용하여 크기를 채울 경우 9개만 적어야합니다 *


다시 로드한 뒤 프로그램을 진행하면 Yep, keyfile found! 라는 메시지와 함께 프로그램이 종료됩니다.


+ Recent posts