-榮-

[CodeEngn] Basic RCE L17 본문

CodeEngn/Basic

[CodeEngn] Basic RCE L17

xii.xxv 2021. 3. 26. 21:33

 

● CodeEngn Basic RCE L17 문제

CodeEngn Basic RCE L17

 

 

 

◎ 파일 실행 화면

 

[그림 1] 파일 실행 화면

 

 

[그림 2] 실패 실행 화면

 

 

문제의 힌트에서 Name은 한 자리라 했지만 Name에 한 문자를 넣으면 "Please Enter More Chars..."이 나옵니다.

패치가 필요해 보입니다.

 

 

패킹 및 난독화 여부 확인

 

[그림 3] PEiD

 

 


 

● CodeEngn Basic RCE L17 분석 및 풀이

 

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

 

문자열 검색으로 성공 문자열을 찾아봅니다.

 

[그림 5] Seach for > All refenced text strings

 

성공 문자열 주소로 이동하면 분기점(0045BBA9)이 보입니다.

 

[그림 6] 성공 문자열 및 분기점 확인

성공 문자열에서 더 내려가면(주소 기준) "Please Enter More Chars..."문자열과 함께 문자열 길이를 3과 비교하는 코드(0045BB24)가 보인다. 이 부분이 패치할 부분입니다.

 

[그림 7] 패치 부분

 

문제의 힌트에서 Name은 한 자리라 했으니 CMP EAX, 3 --> CMP EAX, 1로 패치합니다.

 

[그림 8] 패치

 

[※참고]

패치 파일 만드는 법은 CodeEngn Basic RCE L01의 "+α 패치파일 만드는 법"

 

 

패치 파일을 만들어서 OllyDbg에 올립니다.

 

[그림 9] 디버거 - OllyDbg / 디버기 - 17_patched.exe

 

패치 코드에 BP를 걸고 실행[F9] 후 Step Over[F8]로 진행하다 보면 CALL 0045B850에서 Name(A)에 대한 Serial이 만들어지고, CALL 00404C3C에서 만들어진 Serial과 입력받은 Serial을 비교하는 것을 확인할 수 있습니다.

 

[그림 10] EAX : 입력 Serial / EDX : Create Serial

 

0045BB9B에서 Step Into[F7]를 하여 내부로 이동합니다.

 

[그림 11] CALL 0045B850

 

CALL 0045B850 내부에는 반복문이 크게 4개가 있습니다.

 

[그림 12] CALL 0045B850 내부의 반복문

위 반복문들의 결과는 표와 같습니다.

EDX : FFE3 74F0 EDX : 02C7 33B4
EDI : 08A4 8A32 EBX : E1CB C640

 

[그림 10]에서 Name(A)으로 만들어진 Serial("FFE3-2C73-0502A34C-8A48-E1CB")을 봤을 때, 반복문들의 결과의 (0을 제외한) 4자리가 Serial 앞과 뒤의 내용과 같다는 것을 알 수 있습니다.

 

CALL 0045B850 내부에서 두 번째 반복문 이후의 CALL 0045B54C에서 Serial의 중간 문자열이 만들어지는 것을 확인할 수 있습니다.

 

[그림 13] 중간 Serial

 

네 번째 반복문 이후 코드에서 각 반복문의 결과 값을 4자리 이어 붙이는 코드가 나옵니다.

 

[그림 14] 각 결과 값을 4자리씩 잘라 이어붙이는 부분 中

 

 

Serial이 "BEDA-2F56-BC4F4368-8A71-870B"인 Name을 찾기 위해

첫 번째 반복문을 분석하여 반복문의 결과 값이 "BEDA"가 나오는 한 자리를 찾아봅시다.

 

 

[그림 15] 첫 번째 반복문

 

# 첫 번째 반복문 흐름

첫 번째 반복문
설명 및 예시

1. ecx = 1

2. [반복문]
   1) ebx = [EBP-4]
   2) esi = [EBP+ecx-1]
   3) esi = esi + edx
   4) esi = esi * 772
   5) edx = esi
   6) edx = edx * esi
   7) esi = esi + edx
   8) esi = esi * 474
   9) esi = esi + esi
   10) edx = esi

1. 입력받은 Name의 문자열을 가져오기 위한 ecx
   ex. Name : A

1)
[EBP-4] : 18F50E8
   ex. 입력받은 A의 주소 값

2) esi : 입력받은 Name을 Byte 단위로 입력
   ex. esi : 0x41 ('A')

3) ex. esi : 41 / edx : 0

4) ex. esi : 41 * 772 : 1E3F2

6)
ex. edx : 1E3F2 * 1E3F2 : 92DB 10C4

7) ex. esi : 1E3F2 + 92DB 10C4 : 92DC F4B6

8) ex. esi : 92DC F4B6 * 474 : FFF1 BA78

9) ex. esi : FFF1 BA78 + FFF1 BA78 : FFE3 74F0

 

반복문의 결과 값이 "BEDA"가 나오는 한 자리를 찾는 코드

 

def First_Loop(name):  ## 첫 번째 반복문
    
    esi = name
    esi = esi * 0x772
    edx = esi
    edx = edx * esi
    esi = esi + edx
    esi = esi * 0x474
    esi = esi + esi
    edx = esi

    return edx


    
if __name__ == '__main__':
        
    for name in range(0x30, 0x7A):  ## 숫자 0 부터 z 까지
        serial = First_Loop(name)
        
        lenght = len(hex(serial))
        
        if 'beda' == hex(serial)[lenght-8:lenght-4]:  ## 'beda'와 일치하는 name 출력
            print(chr(name))

 

 


● CodeEngn Basic RCE L17 확인 및 답

 

[그림 16] Python 코드 결과

 

[그림 17] Name 확인

 

CodeEngn Basic RCE L17의 답은 Name의 MD5 (대문자) = 800618943025315F869E4E1F09471012

 

 

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

[CodeEngn] Basic RCE L19 (+α AutoIt 전용 디컴파일러)  (0) 2021.03.27
[CodeEngn] Basic RCE L18  (0) 2021.03.27
[CodeEngn] Basic RCE L16  (0) 2021.03.26
[CodeEngn] Basic RCE L15  (0) 2021.03.25
[CodeEngn] Basic RCE L14  (0) 2021.03.25