일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 서비스프로세스
- Python
- 리버싱핵심원리
- Visual Studio
- Static안티디버깅
- PEImage
- x32dbg
- hxd
- UTF-32
- RedLine Stealer
- Self-Creation
- Dynamic안티디버깅
- Exe2Aut
- Advanced안티디버깅
- .net
- DebugBlocker
- IL코드
- 안티디버깅
- OllyDbg
- 리버싱
- CP949
- 서비스디버깅
- UTF-16
- dotPeek
- ImageSwitching
- 분석 보고서
- JIT
- 디버깅
- CodeEngn
- PEImageSwitching
- Today
- Total
-榮-
[CodeEngn] Advance RCE L15 본문
● CodeEngn Advance RCE L15 문제
◎ 파일 실행 화면
Username and Serial Validation으로 넘어가려면 리버싱으로 Unlock Code를 찾아야 되는 것으로 확인됩니다.
◎ 패킹 및 난독화 여부 확인
● CodeEngn Advance RCE L15 풀이
현재 모듈에서 호출되는 함수를 찾아보면 없다고 뜹니다. [그림 2]에서 패킹이 없다는 것을 확인했으니 파일이 암호화되어있을 겁니다.
[그림 3]에서 진행하면, [그림 5]를 걸치면서 코드가 복호화됩니다.
복호화가 된 최종 결과는 [그림 6]이며, 이 곳이 OEP입니다.
[그림 6]에서 [Plugins > Scylla]에서 DUMP 파일을 생성합니다.
현재 모듈에서 호출되는 함수를 찾아보면 GetDlgItemTextA 함수를 확인할 수 있습니다. 이 함수를 사용하여 프로그램이 입력받은 Unlock Code와 Name, Serial을 입력받는 것으로 추측됩니다. BP를 걸고 실행을 하여 해당 주소로 이동합니다.
Unlock Code 입력 후 디버거를 보면 CMP eax, 7을 하여 비교하는 것을 확인할 수 있습니다. 즉, Unlock Code는 8자 이상이어야 합니다.
Unlock Code가 8자 이상이라는 것을 알았으니 실행하여 Name과 Serial을 입력하면 어떤 창이 뜰지 실행해봅시다. [그림 10]처럼 작성하여 Check를 누르면 화면이 꺼집니다. 즉, 제대로 된 실행이 아닌 것 같습니다.
Unlock Code를 입력받은 후 CALL 4012D2의 내부를 확인하면 입력받은 Code를 사용하여 ECX(10h)와 곱하며 합을 만들어가는 것을 확인할 수 있습니다.
'ABCDABCD'가 입력될 경우 'F0'이 생성되는 것을 확인할 수 있습니다.
CALL 4012D2의 결과를 사용하여 CALL 4012F7 내부에서 [004011C1 ~ 0040123C]까지 XOR을 하는 코드가 있습니다. 이는 [004011C1 ~ 0040123C]가 암호화되어있다는 것이며, CALL 4012D2의 결과와 XOR 하는 것으로 복호화하는 것을 의미합니다.
이후 진행하면 Name과 Serial을 입력받습니다. [그림 15]를 설명하면, 004010F1에서 입력받은 Name을 찾아오고, 1자에서 16자 사이의 길이를 가지는지 확인합니다. 00401135 CALL 4011E8에서 입력받은 Name을 사용하여 Serial을 생성합니다.
CALL 4011E8의 내부를 확인하면 코드가 이상한 것을 볼 수 있습니다. 이 코드는 [그림 14]에서 확인한 XOR 해서 만들어진 코드입니다. 즉, 제대로 복호화 Key가 잘 못되었다는 겁니다.
함수의 프롤로그는 '55h'로 시작합니다. [그림 13]에서 처음 hex 값은 '70h'입니다. '70h'과 XOR 하여 '55h'를 만드는 값은 '25h'입니다. 따라서 코드 복호화 Key는 '25h'가 되어야 합니다.
Unlock Code를 사용하여 Key를 만들고 난 후 Key의 값을 '25h'로 변경하고 진행합니다.
004011E8까지 진행하면 정상적으로 복호화된 코드를 확인할 수 있습니다.
[그림 19]의 CALL 4011C1에서 입력된 Name을 사용하여 Serial을 만드는 Key를 생성합니다. 생성과정은 [그림 11]에서 Unlock Code로 코드 복호화 Key를 생성하는 과정과 같습니다.
CALL 4011C1에서 생성된 Key를 사용하여 Serial을 생성합니다. Serial 생성은 [그림 11]에서 Unlock Code로 코드 복호화 Key를 생성하는 과정과 유사하며, 이후 생성된 값을 16진수로 변환하는 코드가 추가되어있습니다. (Ex. 0Ah -> 41h(A))
[그림 21]에서 CodeEngn Advance RCE L15의 답 Name(CodeEngn.com)의 Serial을 확인할 수 있습니다.
프로그램의 흐름을 좀 더 살펴보면, Serial이 생성된 후 입력받은 Serial을 찾아와 CALL 401280에서 비교하는 것을 확인할 수 있습니다.
CALL 401280의 내부는 [그림 23]과 같으며, 입력받은 Serial과 생성된 Serial을 한자씩 비교합니다.
+α
[그림 22]에서 입력받은 Serial은 [00403329]에서 찾을 수 있습니다.
입력받은 Serial이 16Byte보다 많아도 GetDlgItemTextA 함수에서 16Byte까지만 찾아옵니다.
● CodeEngn Advance RCE L15 확인
'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 |