#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 |