-榮-

[CodeEngn] Advance RCE L10 본문

CodeEngn/Advance

[CodeEngn] Advance RCE L10

xii.xxv 2021. 4. 7. 14:43

● CodeEngn Advance RCE L10 문제

 

CodeEngn Advance RCE L10

 

◎ 파일 실행 화면

[그림 1] 파일 실행 화면 및 실패 화면

 

◎ 패킹 및 난독화 여부 확인

[그림 2] exeinfo PE

 


 

● CodeEngn Advance RCE L10 분석 및 풀이

 

[그림 3] 디버거 - OllyDbg / 디버기 - 10.exe (Advance RCE L10 실행파일)

 

[그림 1]에서 화면의 문자열을 [Search for > All referenced text strings]에서 찾습니다. "Enter Your Name : "으로 이동하여 Name과 Serial을 입력받는 함수를 알아내고, 입력 이후부터 분기 조건 사이에 Name과 Serial의 관계를 찾아보겠습니다.

[그림 4] Search for > All referenced text strings

 

"Enter Your Name : "의 코드입니다. CALL 043EDD8이 문자열을 출력하는 함수로 추측됩니다. 스크롤을 내려 Serial을 입력받고 어떤 행위가 조건 분기로 이어지는지 확인해 보겠습니다.

[그림 5] "Enter Your Name : "

 

[그림 6]은 Serial을 입력받고 조건 분기로 가기 전의 코드들입니다.

[그림 6] 조건 분기 전의 코드

 

[그림 7]이 조건 분기입니다. [EBP-A5]와 0을 비교해서 성공과 실패를 결정합니다. [EBP-A5]는 [그림 6]의 CALL 0040144C에서 반환 값의 일부를 [EBP-A5]에 적는 것을 확인할 수 있습니다. 즉, 조건 분기에 영향을 끼치는 함수는 0040144C입니다.

[그림 7] 조건 분기 

 

CALL 0040144C의 내부로 들어가서 Name과 Serial의 관계를 살펴볼 것입니다. [그림 8]은 0040144C부터의 파일의 흐름을 핵심만 정리해 놓은 것입니다. (반환은 정리하지 않았습니다.)

진행(반복) 순서 :

-> {[ -> -> -> ] -> [  ->  ->  ->  ] -> [  ->  ->  ->  ] -> -> }

-> {[  ->  ->  ->  ] -> [  ->  ->  ->  ] -> [  ->  ->  ->  ] ->  ->  }

-> {[  ->  ->  ->  ] -> [  ->  ->  ->  ] -> [  ->  ->  ->  ] ->  ->  } -> RETN

[그림 8]  핵심 흐름

 

[그림 8]에서 정리된 부분을 코드로 확인하도록 하겠습니다.

 

◎ 0040144C 함수 확인

으로 0040144C로 들어왔을 때, 반복문의 시작 지점이자, [그림 8]에서 의 JMP 명령어로 이동되는 주소입니다. 참고로 이 비교문에서 [EBP-70]의 값이 크다면 0040144C는 RETN 됩니다. 

[그림 9]  반복문 시작 지점

 

[그림 8]의 'Name 들고 오는 코드 및 Byte 단위로 입력' 부분입니다. 

[그림 10] Name 1 byte

 

[그림 8]의 'Serial 들고 오는 코드 및 Byte 단위로 입력' 부분입니다. 

[그림 11] Serial 1 byte

 

[그림 8]에서 으로 이동하는 호출 부분입니다. 이 함수의 반환 값은 덤프 443000에 위치한 문자열(주석의 Strings)에서의 Name 또는 Serial이 두 번째로 위치하는 곳을 반환하는 함수입니다.

첫 번째 호출에서는 Serial, 두 번째 호출에서는 Name의 위치를 반환합니다.

[그림 12] 덤프 443000에 위치한 문자열(주석의 Strings)의 Name 또는 Serial이 두 번째로 위치하는 곳을 반환하는 함수

 

[그림 12]의 함수에서 반환된 Name과 Serial의 위치의 차가 5 이하여야 성공이 됩니다. CALL 0043DB70은 SUB EAX, EDX의 결과를 절댓값으로 변환해주는 함수입니다.

[그림 13] 조건 분기 - Name과 Serial의 위치의 차가 5 이하

 

이렇게 Name의 첫 Byte와 Serial의 첫 Byte의 비교가 끝나면 Serial의 Byte를 가져오는 곳부터 반복하여, Name의 첫 Byte와 Serial의 두 번째 Byte의 비교가 시작됩니다. [그림 8]의 에 해당하는 부분입니다.

[그림 14] [그림 8]의 ⑤ - Serial 반복

 

◎ 00401406 함수 확인

[그림 12]의 CALL 00401406의 내부입니다. 이 함수에서 00414B10의 호출을 두 번하여 Name과 Serial의 두 번째 위치가 반환되는 것입니다.

[그림 15] 00401406 내부

 

◎ 00414B10 함수 확인

[그림 16]이 Name과 Serial의 위치를 반환하는 함수를 호출하는 함수입니다. 이곳에서 찾아야 되는 Name 또는 Serial을 파라미터로 넘겨주며, 두 번째 호출 시에는 첫 번째 호출에서 찾은 위치를 파라미터로 넘겨주어 찾는 Byte의 두 번째 위치가 반환되도록 합니다.

[그림 16] 위치를 반환하는 함수를 호출하는 함수

 

◎ 00414AA0 함수 확인

Name과 Serial의 위치를 반환하는 함수입니다. 반복문의 동작은 [그림 17]의 주석을 읽어보면 이해를 할 수 있을 겁니다.

[그림 17] Strings의 문자열에서 Name, Serial 위치 찾는 반복문

 

◎ 0043DB70 함수 확인

두 번째 Serial 위치에서 두 번째 Name 위치의 차를 절댓값으로 변환해주는 함수입니다.

[그림 18] 절댓값 반환 함수

 

[그림 13]에서 두 번째 Serial 위치에서 두 번째 Name 위치의 차가 5 이하여야 한다는 것을 확인하였습니다.

즉, Name은 덤프의 00443000의 문자열(Strings)의 두 번째 Serial 위치에서 5Byte 내의 문자이며, 두 번째로 나타나는 값일 때, 성공 메시지가 나올 것입니다.

00443000  41 4A 58 47 52 46 56 36 42 4B 4F 57 33 59 39 54  AJXGRFV6BKOW3Y9T
00443010  4D 34 53 32 5A 55 20 49 37 30 48 35 51 38 31 50  M4S2ZU I70H5Q81P
00443020  44 45 43 4C 4E 41 4A 58 47 52 46 56 36 42 4B 4F  DECLNAJXGRFV6BKO
00443030  57 33 59 39 54 4D 34 53 32 5A 55 20 49 37 30 48  W3Y9TM4S2ZU I70H
00443040  35 51 38 31 50 44 45 43 4C 4E 41 4A 58 47 52 46  5Q81PDECLNAJXGRF
00443050  56 36 42 4B 4F 57 33 59 39 54 4D 34 53 32 5A 55  V6BKOW3Y9TM4S2ZU
00443060  20 49 37 30 48 35 51 38 31 50 44 45 43 4C 4E 00   I70H5Q81PDECLN.
I70H5Q81PDECLNAJXGRFV6BKOW3Y9TM4S2ZU  문자열 반복 / 시작은 AJXG부터

위의 두 조건을 만족하는 값은 아래와 같습니다. (Serial : WWWCCCJJJRRR) 아래의 값들이 Serial의 Name이 될 수 있는 값들이며, CodeEngn Advance RCE L10의 Hint2의 정답으로 나올 수 있는 문자열 중 순서상 가장 먼저 오는 문자열은 31A6입니다.

V 6 B K O - W - 3 Y 9 T M
8 1 P D E - C - L N        
           A - J - X G R F V
   A J X G - R - F V 6 B K

 


 

● CodeEngn Advance RCE L10 확인

 

[그림 19] Good job

 

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

[CodeEngn] Advance RCE L14  (0) 2021.04.16
[CodeEngn] Advance RCE L11  (2) 2021.04.08
[CodeEngn] Advance RCE L09  (0) 2021.04.05
[CodeEngn] Advance RCE L08  (0) 2021.04.05
[CodeEngn] Advance RCE L07  (0) 2021.04.04