EAX란?

(Extended Accumulator)

AX 레지스터의 확장(Extended) 레지스터로 함수에서 return 값을 전달하는데 사용된다.

어셈블리어에서 가장 많이 쓰이는 레지스터로 모든 연산에 주로 사용되는 변수


EDX란?

(Extended Data)

EAX와 거의 흡사하나 return 값을 전달하는 용도로는 사용되지 않는다.

기본 연산과 복잡한 연산에 주로 사용되는 변수


ECX란?

(Extended Count)

반복문에서의 카운트를 담당하는 용도로 사용된다. 카운트가 필요없는 코드에서는 변수로 사용이 가능하다.

for (int i=0; i<=10; i++) 에서 int i에 해당한다.

어셈블리어에서의 반복문은 10에서 i-- 로 진행된다. ECX에 반복할 횟수가 미리 지정되어있음.


EBX란?

(Extended Base)

특정 용도로 만들어진 레지스터가 아닌, 레지스터가 더 필요할때 사용된다.

EAX, ECX, EDX 레지스터가 부족할 때 사용됨


사용된 디버거 : 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