-榮-

[CodeEngn] Advance RCE L15 본문

CodeEngn/Advance

[CodeEngn] Advance RCE L15

xii.xxv 2021. 4. 19. 18:02

● CodeEngn Advance RCE L15 문제

 

CodeEngn Advance RCE L15

 

◎ 파일 실행 화면

[그림 1] 파일 실행 화면 및 Unlock Code Error

 

Username and Serial Validation으로 넘어가려면 리버싱으로 Unlock Code를 찾아야 되는 것으로 확인됩니다.

 

◎ 패킹 및 난독화 여부 확인

[그림 2] exeinfo PE

 


 

● CodeEngn Advance RCE L15 풀이

 

[그림 3] 디버거 - x32dbg / 디버기 - 15.exe (Advance RCE L15 실행파일)

 

현재 모듈에서 호출되는 함수를 찾아보면 없다고 뜹니다. [그림 2]에서 패킹이 없다는 것을 확인했으니 파일이 암호화되어있을 겁니다.

[그림 4] Search for > Current module > Intermodular calls

 

[그림 3]에서 진행하면, [그림 5]를 걸치면서 코드가 복호화됩니다.

[그림 5] 00401400 코드 복호화 및 00401000 코드 복호화

 

복호화가 된 최종 결과는 [그림 6]이며, 이 곳이 OEP입니다.

[그림 6] OEP

[그림 6]에서 [Plugins > Scylla]에서 DUMP 파일을 생성합니다.

[그림 7] DUMP

 

현재 모듈에서 호출되는 함수를 찾아보면 GetDlgItemTextA 함수를 확인할 수 있습니다. 이 함수를 사용하여 프로그램이 입력받은 Unlock Code와 Name, Serial을 입력받는 것으로 추측됩니다. BP를 걸고 실행을 하여 해당 주소로 이동합니다.

[그림 8] Search for > Current module > Intermodular calls

Unlock Code 입력 후 디버거를 보면 CMP eax, 7을 하여 비교하는 것을 확인할 수 있습니다. 즉, Unlock Code는 8자 이상이어야 합니다.

[그림 9] Unlock Code

 

Unlock Code가 8자 이상이라는 것을 알았으니 실행하여 Name과 Serial을 입력하면 어떤 창이 뜰지 실행해봅시다. [그림 10]처럼 작성하여 Check를 누르면 화면이 꺼집니다. 즉, 제대로 된 실행이 아닌 것 같습니다.

[그림 10] Name, Serial 입력

 

Unlock Code를 입력받은 후 CALL 4012D2의 내부를 확인하면 입력받은 Code를 사용하여 ECX(10h)와 곱하며 합을 만들어가는 것을 확인할 수 있습니다.

[그림 11] CALL 4012D2 내부

'ABCDABCD'가 입력될 경우 'F0'이 생성되는 것을 확인할 수 있습니다.

[그림 12] CALL 4012D2 결과

CALL 4012D2의 결과를 사용하여 CALL 4012F7 내부에서 [004011C1 ~ 0040123C]까지 XOR을 하는 코드가 있습니다. 이는 [004011C1 ~ 0040123C]가 암호화되어있다는 것이며, CALL 4012D2의 결과와 XOR 하는 것으로 복호화하는 것을 의미합니다.

[그림 13] 4011C1 복호화

 

[그림 14] 복호화 결과

 

이후 진행하면 Name과 Serial을 입력받습니다. [그림 15]를 설명하면, 004010F1에서 입력받은 Name을 찾아오고, 1자에서 16자 사이의 길이를 가지는지 확인합니다. 00401135 CALL 4011E8에서 입력받은 Name을 사용하여 Serial을 생성합니다.

[그림 15] Name 및 Serial

 

CALL 4011E8의 내부를 확인하면 코드가 이상한 것을 볼 수 있습니다. 이 코드는 [그림 14]에서 확인한 XOR 해서 만들어진 코드입니다. 즉, 제대로 복호화 Key가 잘 못되었다는 겁니다.

[그림 16] 잘못된 Key로 복호화된 코드

 

함수의 프롤로그는 '55h'로 시작합니다. [그림 13]에서 처음 hex 값은 '70h'입니다. '70h'과 XOR 하여 '55h'를 만드는 값은 '25h'입니다. 따라서 코드 복호화 Key는 '25h'가 되어야 합니다.

[그림 17] 70 XOR 55 = 25

 

Unlock Code를 사용하여 Key를 만들고 난 후 Key의 값을 '25h'로 변경하고 진행합니다.

[그림 18] 코드 복호화 Key 수정

 

004011E8까지 진행하면 정상적으로 복호화된 코드를 확인할 수 있습니다.

[그림 19] 정상적으로 복호화된 코드

 

[그림 19]의 CALL 4011C1에서 입력된 Name을 사용하여 Serial을 만드는 Key를 생성합니다. 생성과정은 [그림 11]에서 Unlock Code로 코드 복호화 Key를 생성하는 과정과 같습니다.

[그림 20] Serial을 만드는 Key 생성

CALL 4011C1에서 생성된 Key를 사용하여 Serial을 생성합니다. Serial 생성은 [그림 11]에서 Unlock Code로 코드 복호화 Key를 생성하는 과정과 유사하며, 이후 생성된 값을 16진수로 변환하는 코드가 추가되어있습니다. (Ex. 0Ah -> 41h(A))

[그림 21] Serial 생성

 

[그림 21]에서 CodeEngn Advance RCE L15의 답 Name(CodeEngn.com)의 Serial을 확인할 수 있습니다.

프로그램의 흐름을 좀 더 살펴보면, Serial이 생성된 후 입력받은 Serial을 찾아와 CALL 401280에서 비교하는 것을 확인할 수 있습니다.

 

[그림 22] Serial 비교 함수

CALL 401280의 내부는 [그림 23]과 같으며, 입력받은 Serial과 생성된 Serial을 한자씩 비교합니다.

[그림 23] CALL 401280의 내부

 


[그림 22]에서 입력받은 Serial은 [00403329]에서 찾을 수 있습니다.

[그림 24] 입력받은 Serial

입력받은 Serial이 16Byte보다 많아도 GetDlgItemTextA 함수에서 16Byte까지만 찾아옵니다.

 


 

● CodeEngn Advance RCE L15 확인

 

[그림 25] You hace entered valid valuse!

 

 

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

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