-榮-

[CodeEngn] Basic RCE L14 본문

CodeEngn/Basic

[CodeEngn] Basic RCE L14

xii.xxv 2021. 3. 25. 18:42

 

● CodeEngn Basic RCE L14 문제

 

CodeEngn Basic RCE L14

 

 

◎ 파일 실행 화면

 

 

[그림 1] 파일 실행 화면

 

[그림 2] Wrong Serial

 

패킹 및 난독화 여부 확인

 

[그림 3] PEiD - UPX 패킹 확인

 


 

● CodeEngn Basic RCE L14 풀이

 

 

[그림 4] 디버거 - OllyDbg / 디버기 - 14.exe (Basic RCE L14 실행파일)

OEP를 찾아서 이동합니다.

 

[※참고]

UPX 패킹에서 OEP를 찾는 법은 CodeEngn Basic RCE L05의 "+α UPX 패킹 상태에서 OEP 찾는 법"

 

[그림 5] 14.exe의 OEP 위치

 

"You Have Enter A Wrong Serial, Please Try Agian" 메시지 박스를 봤을 때, MessageBoxA 또는 MessageBoxW 함수를 사용한 것이라 생각됩니다.

 

[Search for > All intermodular calls]에서 MessageBox 관련 함수를 찾아 BP를 걸고 실행[F9] 했을 때, 실패하는 MessageBox 함수의 위에 분기점과 분기 조건이 있을 거라 예상됩니다.

 

[그림 6] MessageBox 관련 함수

[※참고]

Found intermodular calls에 BP 관련은 CodeEngn Basic RCE L03의 "+α 함수를 알고 있다면..."

 

[그림 7] MessageBoxA 함수에 BP

 

Name : CodeEngn / Serial : 12345 일 때, 실패 MessageBoxA 함수 위치를 찾았습니다.

 

[그림 8] 실패 MessageBoxA 위치 확인

 

실패 메시지 박스 함수 위에 성공 메시지 박스 함수와 분기점으로 보이는 0040133C와 분기 조건으로 보이는 0040133A을 볼 수 있습니다.

 

코드를 보았을 때,  ESI와 입력 Serial 또는 입력 Serial을 사용하여 CALL 00401383에서 만든 반환 값과 POP ESI를 비교하는 것이 분기 조건으로 보입니다.

 

[그림 9] 분기 조건

 

POP ESI가 PUSH ESI의 값과 같은 것을 보아 CALL 00401383에서 사용하는 파라미터는 입력 Serial만 일 것으로 판단됩니다.

또한, Name(CodeEngn)에 대응하는 Serial 값을 암호화(?)한 값은 000129A1이며, 12345를 암호화(?)하면 00003039를 가진다는 것을 알 수 있습니다.

 

[그림 10] 함수의 반환 값과 ESI 확인

 

CALL 00401383에서 Step into[F7]를 하여 함수 내부를 살펴봅시다.

 

[그림 11] CALL 00401383

 

CALL 00401383의 내부 흐름

00401383 내부 코드 설명 반복문 설명 및 예시

1. eax = 입력 Serial 길이 (lstrlenA 함수)
2. ebx 초기화
3. ecx = eax (입력 Serial 길이)
4. esi = 입력 Serial ("12345")
5. [반복문]
     1) eax = 입력 Serial의 Byte
     2) eax = eax - 30   
     3) [반복문]
          -1. eax = eax * 0xA
     4) ebx = ebx + eax

5. 입력된 Serial의 길이만큼 반복
        ex. for (int i = ecx; i > 0; i--)

1) 입력된 Serial을 하나씩 가져옴
       
ex. Serial이1000이면 eax = 31 (10진수 : 1)

2) 16진수를 10진수로 변환
       
ex. 31 (10진수 : 1) - 30 = 1

-1. 10진수를 입력받은 자리 수에 맞추어 16진수로 변환
        ex. 1 * A를 3번 반복 = 1000의 16진수

4) 최종적으로 입력받은 Serial Key를 16진수로 변환
       
ex. ebx = 3E8 (10진수 : 1000)

 

CALL 00401383이 입력받은 Serial 값을 16진수로 변환하는 함수라는 것을 알아내었습니다.

 

[그림 12] 입력 값 12345 / 반환 값 3039

 

CALL 00401383의 분석이 맞는지 입력 값 : 12345 /  반환 값 : 3039로 확인해 봅시다.

 

[그림 13] 12345의 16진수 3039 확인

 

CodeEngn Basic RCE L14의 답은 ESI 00129A1를 10진수로 변환했을 때의 값입니다.

 

 


 

● CodeEngn Basic RCE L14 확인

 

[그림 14] 129A1의 10진수 변환 값

 

 

[그림 15] 성공 메시지 박스

 

 

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

[CodeEngn] Basic RCE L16  (0) 2021.03.26
[CodeEngn] Basic RCE L15  (0) 2021.03.25
[CodeEngn] Basic RCE L13  (0) 2021.03.25
[CodeEngn] Basic RCE L12 (+α PEView 주소 변환)  (0) 2021.03.24
[CodeEngn] Basic RCE L11  (0) 2021.03.24