-榮-

[CodeEngn] Basic RCE L20 본문

CodeEngn/Basic

[CodeEngn] Basic RCE L20

xii.xxv 2021. 3. 29. 01:28

 

● CodeEngn Basic RCE L20 문제

 

 

CodeEngn Basic RCE L20

 

 

◎ 파일 실행 화면

 

 

[그림 1] 파일 실행 화면

 

 

패킹 및 난독화 여부 확인

 

 

[그림 2] Exeinfo PE

 


 

● CodeEngn Basic RCE 20 분석 및 풀이

 

 

[그림 3] 디버거 - OllyDbg / 디버기 - 20.exe (Basic RCE L20 실행파일)

 

OllyDbg에 파일을 올리고, Step Over[F8]로 진행하다 보면 CreateFileA 함수가 호출됩니다.

CreateFileA 함수는 파일 또는 입/출력 장치를 생성하거나 여는 함수입니다. (출처:MSDN)

 

[그림 4]에서 CreateFileA 함수 실행 결과 "CRACKME3.KEY" 파일을 생성하지 못했으니 "CRACKME3.KEY" 파일을 만들어서 실행하도록 합니다.

 

CreateFileA 함수 아래에는 FileRead 함수가 있습니다. FileRead 함수는 CreateFileA 함수에서 연 파일의 내용을 읽어오는 역할을 합니다. FileRead 함수의 Parameter을 보면 BytesToRead가 12h로 파일에서 18Byte를 읽어는 함수입니다. 따라서 "CRACKME3.KEY" 파일을 생성할 때, 내용을 임의의 내용을 18Byte 기재합니다.

 

[그림 4] CreateFileA 함수 실행 실패 및 ReadFile

 

[그림 5] CreateFileA 함수 정의(출처:MSDN)

 

[그림 6] CRACKME3.KEY 파일 생성

 

ReadFile 함수는 생성한 "CRACKME3.KEY" 파일의 내용을 18Byte 읽어서 00402008에 적습니다.

ReadFile 함수에서 004021A0에 읽어온 Byte의 크기를 적는데 18Byte를 읽어왔는지 00401066에서 확인합니다.

 

[그림 7] ReadFile

 

파일을 읽어오면 이후에 CALL을 두개 거쳐서 진행됩니다.

0040109D에서 암호화된 파일 내용을 점검하고, JMP를 결정합니다.

  1. 0040109F JMP가 진행되면, CreateFileA 아래에 있는 ASCII "CreakMe v3.0 코드 부분에서 진행이 되고 004010AE로 JMP 하여  FindWindowA 함수를 거쳐 RETN 된다고 생각됩니다.
  2. 0040109F JMP가 진행되지 않으면, 계속 진행되다가 004010BC에서 JMP 하여 계속 진행되는 것으로 생각됩니다.

 

[그림 8] 전체적 흐름 1

 

[그림 9] 전체적 흐름 2

 

"CRACKME3.KEY" 파일에 "ABCDabcdEFGHefghIJ"를 기재하고 진행하면 00401079에서 [4020F9]가 0이라 내부로 들어가 흐름을 파악해보았습니다.

 

00401074 CALL 00401311 내부의 반복문입니다. 반복문의 흐름을 살펴봅시다.

 

[그림 10] CALL 00401311 내부의 반복문

 

  CALL 00401311 내부 흐름

CALL 00401311 설명 설명 및 예시

1. esi = CRACKME3.KEY 파일의 문자열
2. bl = 41

3. [반복문]
   1) al = [esi]
   2) al = al ^ bl
   3) esi = al
   4) esi = esi + 1
   5) bl = bl + 1
   6) [4020F9] = [4020F9] + eax
   7) CMP al, 0
   8) cl = cl + 1
   9) CMP bl, 4F

1) CRACKME3.KEY 파일의 문자 1Byte씩 eax 넣는다.

3) bl과 XOR한 문자기존에 있던 자리에 적는다.
   파일의 내용이 있던 자리에 암호화된 내용이 적힌다.

4) 다음 문자를 가르켜 1)에서 다음 문자열 넣을 준비

5) (문자와 XOR하는)암호화 키를 1씩 증가시킨다.

6) 최종적으로 [4020F9]에 암호화된 문자의 합이 적힌다.

7) 암호화한 문자가 0이면 반복문을 종료한다.
   ex. "ABCDabcdEFGHefghIJ"의 "A"와 bl(41h : "A")가
        XOR되어 종료된다.

8) 암호화한 횟수를 센다.

9) 암호화 횟수가 14번 이상이면 반복문을 종료한다

 

"CRACKME3.KEY" 파일의 "ABCDabcdEFGHefghIJ"은 처음의 "A"문자로 인해 00401311의 반복문의 7)에서 암호화 진행되지 못하고 종료됩니다.

 

암호화의 원활한 진행을 위해 "CRACKME3.KEY" 파일의 문자열을 수정하였습니다.

 

[그림 11] 수정된 CRACKME3.KEY 파일

 

ReadFile 함수에서 수정된 문자열을 확인하고 진행합니다. 문자열 수정 후 CALL 00401311을 진행하면 ECX가 Dh이므로 14번 반복문이 진행된 것을 확인할 수 있습니다.

 

[그림 12] 수정된 문자열 확인

 

[그림 13] 반복문 결과 (암호화된 문자열과 암호화된 문자의 합)

 

 

[그림 8]에서 첫 번째 CALL 00401311을 나오면 [004020F]와 12345678을 XOR 하여 [004020F]에 적습니다. 그리고 두 번째 CALL 0040133C 코드가 나옵니다.

 

두 번째 CALL 0040133C의 내부를 살펴보면 암호화되지 않은 문자열을 반환하는 함수라는 것을 알 수 있습니다.

 

[그림 14] CALL 0040133C

 

CALL 0040133C의 반환 값(6A694847)과 [4020F9](12345728)을 비교하여 같아야 0040109F에서 JMP하지 않고 넘어갑니다. (KEY의 마지막 4Byte는 암호화된 문자의 합과 12345678을 XOR 한 결과 값이어야 한다는 것을 알 수 있습니다.)

 

[그림 15] 분기 조건

 

"CRACKME3.KEY" 파일의 마지막 4Byte를 12345728로 수정하고 진행합니다.

 

[그림 16] 마지막 4Byte 수정

 

ReadFile에서 읽어온 파일을 확인하고 실행[F9]합니다.

 

[그림 17] 수정된 파일 내용 확인

 

실행[F9]하면 해당 윈도우 창이 나타납니다.

화면의 내용은 "CRACKME3.KEY" 파일이 암호화된 내용(14Byte)이라는 것을 알 수 있습니다. [그림 13]

 

CodeEngn Basic RCE L20은 Cracked by:CodeEngn! 가 나와야 됩니다.

즉, 암호화 결과가 CodeEngn이 되게 파일을 수정하면 됩니다.

 

[그림 18] 실행 화면

 

 

암호화는 첫 번째 CALL 00401311에서 이루어지고, 암호화는 XOR로 이루어 집니다.

CALL 00401311을 분석한 결과 암호화 키를 알고 있으며 나와야 되는 결과를 알고 있습니다.

XOR은 평문에 Key를 XOR 해서 암호문을 만들면, 암호문에 같은 key를 XOR 하면 평문이 나온다는 특징을 가지고 있습니다. (평문 xor [key] = 암호문 / 암호문 xor [key] = 평문)

 

 

Cracked by:CodeEngn! 이 나오기 위해서는 CALL 00401311의 7)을 이용해야 됩니다. CodeEngn이 모두 생성되면 반복문을 종료하여 이후 내용이 [그림 18] 화면에 적히지 않게 하는 겁니다. 따라서 CodeEngn 이후에는 00이 되어야 합니다.

 

CodeEngn 43 6F 64 65 45 6E 67 6E 00
Key 41 42 43 44 45 46 47 48 49
XOR 결과 02 2D 27 21 00 28 20 26 49

 

 

표의 결과대로 "CRACKME3.KEY" 파일을 수정합니다.

 

[그림 19] CRACKME3.KEY 파일 수정

 

수정된 "CRACKME3.KEY" 파일을 읽어오는 것을 확인하고 진행합니다.

 

[그림 20] 수정된 파일 내용 확인

수정된 파일 내용의 암호문 내용 확인합니다.

 

[그림 21] 생성된 암호문 확인

 

파일의 내용이 변경되어 암호화된 문자의 합이 변경되었으므로 [004020F9]를 확인하고, 마지막 4Byte를 수정합니다.

 

[그림 22] 마지막 4Byte
[그림 23] 마지막 4Byte 수정

 


● CodeEngn Basic RCE L20 확인

 

"CRACKME3.KEY" 파일의 수정을 마쳤으면, 수정된 내용 확인 후 실행[F9]합니다.

 

[그림 24] 수정된 파일 내용 확인

 

 

[그림 25] 실행 결과

 

CodeEngn Basic RCE L20의 답은 022D27210028202649--------7B553712이다.

(답의 --는 어떤 Byte가 들어가도 되는 자리이다. 이 글에서는 6667684546이 들어갔다.)

'CodeEngn > Basic' 카테고리의 다른 글

[CodeEngn] Basic RCE L02  (0) 2021.03.30
[CodeEngn] Basic RCE L19 (+α AutoIt 전용 디컴파일러)  (0) 2021.03.27
[CodeEngn] Basic RCE L18  (0) 2021.03.27
[CodeEngn] Basic RCE L17  (0) 2021.03.26
[CodeEngn] Basic RCE L16  (0) 2021.03.26