일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- RedLine Stealer
- DebugBlocker
- JIT
- UTF-32
- .net
- PEImage
- Self-Creation
- Exe2Aut
- CodeEngn
- 리버싱핵심원리
- Advanced안티디버깅
- IL코드
- UTF-16
- dotPeek
- Python
- hxd
- ImageSwitching
- OllyDbg
- 리버싱
- CP949
- Visual Studio
- 서비스프로세스
- Dynamic안티디버깅
- 안티디버깅
- Static안티디버깅
- PEImageSwitching
- x32dbg
- 디버깅
- 분석 보고서
- 서비스디버깅
- Today
- Total
-榮-
[CodeEngn] Advance RCE L06 본문
● CodeEngn Advance RCE L06 문제
◎ 파일 실행 화면
◎ 패킹 및 난독화 여부 확인
● CodeEngn Advance RCE L06 풀이
디버거에서 실행 시 [그림 5]의 창이 뜹니다. 이를 통해 디버거를 탐지하는 함수가 있다는 것을 알 수 있습니다.
디버거를 탐지하는 함수 부분을 패치하기 위해 우선 언패킹을 해줍니다.
언패킹 한 파일을 디버거에 올리고 디버거 탐지 함수를 찾습니다.
[Search for > All intermodular calls]에서 디버거를 탐지하는 함수에 BP[F2]를 걸고 실행[F9]합니다.
0040E961의 IsDebuggerPresent 함수에서 멈춥니다. 이 함수의 반환 값의 TEST 명령어를 기준으로 디버거에서 실행되었는지를 판단하는 겁니다. 이 부분을 패치하여 디버거에서도 정상 실행되게 합니다.
TEST EAX, EAX --> CMP EAX, EAX로 패치하였습니다. 이제 패치 파일을 만들어 디버거에 올려줍니다.
[※참고]
패치파일 만드는 법은 CodeEngn Basic RCE L01의 "+α 패치파일 만드는 법"
남은 군생활을 나타내는 메시지 창은 MessageBox 관련 함수를 사용했을 것입니다. 따라서 [Search for > All intermodular calls]에서 MessageBox 관련 함수에 BP[F2]를 걸고 실행합니다.
0045E071에서 MessageBoxW 함수가 남은 군생활을 띄우는 함수인 것을 찾았습니다.
[그림 13]을 시작점으로 트레이싱해본 결과, 파일의 대략적인 핵심 흐름은 [그림 14]와 같습니다.
MessageBoxW에서 남은 군생활을 출력하고 많은 반복문과 JMP를 거쳐 Switch문에서 호출된 함수 내부에서 남은 군생활 숫자를 EBP로 옮기고 출력한 숫자를 EAX로 옮겨서 EBP와 EAX를 비교합니다.
남은 군생활 숫자와 출력한 숫자를 비교하는 코드를 보면 남은 군생활은 316h입니다.
316h를 10진수로 변환하면 790d이 나옵니다. 즉, 790일이 남았다는 겁니다.
CodeEngn Advance RCE L06의 답은 790의 MD5 해시값인 6ECFADC3D3F9053BFB0A2878C38A8BDD입니다.
CodeEngn Advance RCE L06의 파일을 Exe2Aut에 올리면 MsgBox를 출력하는 반복문(For문)을 확인할 수 있습니다.
'CodeEngn > Advance' 카테고리의 다른 글
[CodeEngn] Advance RCE L08 (0) | 2021.04.05 |
---|---|
[CodeEngn] Advance RCE L07 (0) | 2021.04.04 |
[CodeEngn] Advance RCE L05 (0) | 2021.04.02 |
[CodeEngn] Advance RCE L04 Serial 생성 분석 (0) | 2021.04.02 |
[CodeEngn] Advance RCE L04 (0) | 2021.04.02 |