일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- UTF-16
- Dynamic안티디버깅
- 안티디버깅
- Self-Creation
- JIT
- Advanced안티디버깅
- CodeEngn
- 서비스프로세스
- Python
- DebugBlocker
- CP949
- PEImage
- 리버싱핵심원리
- PEImageSwitching
- .net
- OllyDbg
- dotPeek
- UTF-32
- 디버깅
- RedLine Stealer
- 서비스디버깅
- ImageSwitching
- x32dbg
- Exe2Aut
- Static안티디버깅
- 리버싱
- Visual Studio
- IL코드
- hxd
- 분석 보고서
- Today
- Total
-榮-
[CodeEngn] Basic RCE L05 (+α UPX 패킹 상태에서 OEP 찾는 법) 본문
● CodeEngn Basic RCE L05 문제
◎ 파일 실행 화면
"Wrong Serial,try again!" 문자열을 찾고 분기점을 찾으면 될 것 같습니다. 분기를 판별하는 코드가 등록키와 입력된 키를 비교하는 것으로 추정됩니다.
◎ 패킹 및 난독화 여부 확인
※ PE Packer란 실행 파일 압축기입니다.
정확한 명칭은 Run-Time 패커로, PE 파일 전문 압축기입니다. (출처:리버싱 핵심원리)
※ 사용 목적
- PE 파일의 크기를 줄이고자 하는 목적
- PE 파일의 내부 코드와 리소스를 감추기 위한 목적
● CodeEngn Basic RCE L05 분석 및 풀이
※ -d : decompress / -k, --backup : keep backup files
언패킹을 한 뒤 디버거에 올리면 OEP(Original Entry Point)가 띄워지는 것을 확인할 수 있습니다.
[Search for > All referenced text strings]에서 문자열을 찾습니다.
실패 문자열 두 개와 성공 문자열 그리고 그 위에 User이름과 등록키로 추측되는 문자열을 확인할 수 있습니다.
해당 문자열 중 성공 위치를 확인합니다.
[그림 6]을 보고 흐름을 예상해 봅시다.
- [EBP-4]에 위치한 입력받은 USER 문자열과 "Registered User"을 [CALL 00403B2C]에서 비교
- [CALL 420E20]에서 입력받은 등록키를 [EBP-4]에 적재
- [EBP-4]에 위치한 입력받은 등록키와 "GFX-754-IER-954"을 [CALL 00403B2C]에서 비교
- 성공 창 띄우기 [CALL 0043D068]
● CodeEngn Basic RCE L05 확인
예상한 대로 입력하여 확인해봅시다.
+α UPX 패킹 상태에서 OEP 찾는 법
UPX 패킹을 언패킹 하거나 트레이싱하는 방법 외에 빠르게 OEP를 찾는 2가지 방법
- POPAD 찾기
- Hardware BP
1. POPAD 찾기
UPX 패커는 PUSHAD 명령어와 POPAD명령어로 EP코드가 둘러싸여 있다는 특징을 가지고 있습니다. 그리고 OEP로 가는 JMP 명령어가 POPAD 명령어 바로 이후에 나타납니다.
PUSHAD 명령어 다음의 POPAD 명령어 위치에서 바로 다음에 나오는 JMP 명령어가 OEP 위치로 갈 수 있는 명령어입니다.
2. Hardware BP
이 방법도 PUSHAD 명령어와 POPAD명령어로 둘러싸여 있다는 특징을 이용한 방법입니다.
PUSHAD 명령어를 실행하면 스택에 레지스터 값들이 저장됩니다. 이때, dump 창에서 가장 최근에 저장된 스택 주소로 이동하여 Hardware BP를 겁니다.
Hardware BP를 걸고 실행(F9)하면 POPAD가 호출되는 순간, Hardware BP를 설치한 지점이 access 되면서 멈춥니다.
바로 밑에 OEP로 가는 JMP 명령어가 있습니다.
'CodeEngn > Basic' 카테고리의 다른 글
[CodeEngn] Basic RCE L07 (0) | 2021.03.23 |
---|---|
[CodeEngn] Basic RCE L06 (0) | 2021.03.21 |
[CodeEngn] Basic RCE L04 (+α IsDebuggerPresent 우회) (0) | 2021.03.21 |
[CodeEngn] Basic RCE L03 (+α All intermodular calls) (0) | 2021.03.20 |
[CodeEngn] Basic RCE L01 (+α 패치파일 만드는 법) (0) | 2021.03.20 |