#About


Author : Cruhead / MiB



Korean :

이 프로그램은 Key파일을 필요로 하는 프로그램이다.

위 문구가 출력되도록 하려면 crackme3.key 파일안의 데이터는 무엇이 되어야 하는가

Ex) 41424344454647


English :

This program needs a key file.

What does the data in the file crackme3.key have to be to make it print the above message.

Ex) 41424344454647

(This problem has multiple answers, so post your answer on the messageboard in a private thread and we will verify it for you.)




#Contents


XOR 연산의 이해를 통해 CRACKME3.KEY 파일안의 데이터를 입력해줌으로써 CodeEngn!을 출력하는 것이 목표다




#Solution


[그림 1] - 실행화면


20.exe를 실행하면 위와 같은 UI를 확인할 수 있으며 별 다른 기능은 없어보인다


[그림 2] - MASM


PEiD를 통해 패킹여부를 확인결과, 패킹은 되어 있지 않았고 어셈블리어로 코딩되어 있었다


[그림 3] - 실행 화면


00401066 위까지의 과정을 설명하면 다음과 같다. CreateFileA 함수를 통해 CRACKME3.KEY 파일을 만들고 


ReadFile 함수를 통해 0x12 즉 18바이트를 읽어들인다 이는 먼저 CRACKME3.KEY 파일을 18바이트를 채워 만들어 놓는 


과정을 진행 해야 함을 의미하기에 아래와 같이 18 바이트 크기의 CRACKME3.KEY 파일을 만들어 주었다


[그림 4] - CRACKME3.KEY 파일


위와 같이 파일을 작성하고 ReadFile 함수를 거치게 되면 아래와 같이 00402008~004020019부분에 CRACKME3.KEY 파일의 내용을 읽어 들인다


[그림 5] - ReadFile 함수 실행


위와 같이 CRACKME3.KEY 파일을 읽어 들인 후 


[그림 6] - 00401311 호출


위의 00401074 주소의 명령을 살펴보면, 00401311을 호출하며 해당 호출 주소로 따라가 본 결과는 아래와 같다


[그림 7] - 알고리즘


위 0040133B 까지의 루틴을 해석하면 아래와 같다


00401311

ECX를 0으로 만듦


00401313

EAX를 0으로 만듦


00401315

[ESP+4]의 주소 값을 ESI에 복사 = CRACKME3.KEY 파일의 내용이 적힌 주소 값을 ESI에 복사


00401319

41을 EBX의 최하위 1 바이트에 복사


0040131B

[ESI]의 주소 값에 담긴 최하위 1 바이트를 EAX에 복사


0040131D

EAX와 EBX의 최하위 1 바이트를 XOR 연산 결과를 EAX에 복사


0040131F

EAX의 최하위 1 바이트를 ESI의 최하위 바이트에 복사


00401321

ESI 값을 1증가


00401322

EBX의 최하위 1 바이트 값 증가


00401324

EAX 값을 4020F9에 복사


0040132A

EAX의 최하위 1바이트를 0과 비교


0040132C

0040132A의 명령이 참이라면 00401335로 분기


0040132E

ECX의 최하위 1 바이트값을 1증가


00401330

EBX의 최하위 1바이트와 0x4F 비교


00401333

00401330의 명령이 거짓이라면 0040131B로 분기


00401335

ECX의 값을 402149로 복사


0040133B

리턴


위 루틴은 결국 반복문이 진행되는 동안 문자열 1바이트와 0x41~0x4F까지 XOR한 결과 값인 AL을 4020F9에 계속 더한다


0x41~0x4F의 길이는 14이며 이는, CRACKME3.KEY의 14글자는 XOR 연산에 쓰이지만 나머지 4글자는 쓰이지 않음을 의미하며


이를 다시 설명하면 결국 14글자가 키 값을 생성하는 알고리즘에 사용되는 것이고 나머지 4글자가 키에 해당한다


다시 코드로 돌아온 아래 그림을 살펴보자


[그림 8] - 포인트 루틴


위 빨간 네모박스에 있는 루틴을 간략히 설명하면, 00401074의 XOR 연산 결과 값이 담긴 주소의 값이랑 12345678이랑 XOR 연산을 진행한다


그리고 0040108B에서 CALL 0040133C 명령을 통해 XOR 연산에 쓰이지 않은 나머지 4글자를 가져와 EAX에 반환한다


00401093의 비교 구문을 통해 EAX와 [4020F9]를 비교하며 00401099의 SETE AL명령을 통해 위 조건문(CMP)의 결과가 


참일 경우 1을 반환하며 아닐 시 보수를 AL의 사이즈에 맞게 반환한다


00401093의 비교구문의 거짓을 의미하는 보수 값이 AL에 담기면 0040109F의 명령을 통해 실패로 분기하며


참을 의미하는 값 1이 AL에 담겼다면 004010A6의 CALL 00401346의 명령을 통해 크랙 성공 메시지가 출력된다


[그림 9] - XOR 값


[그림 10] - 인증



'Wargame' 카테고리의 다른 글

[Lord of SQL Injection] Cobolt  (0) 2017.10.25
[Lord of SQL Injection] Gremlin  (0) 2017.10.25
CodeEngn Basic 19  (0) 2017.10.19
CodeEngn Basic 18  (0) 2017.10.17
CodeEngn Basic 17  (0) 2017.10.17

+ Recent posts