사용된 디버거 : 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! 라는 메시지와 함께 프로그램이 종료됩니다.