UPack 의 PE Header 변경 기법에 대해서는 이전의 제 글을 참고하시기 바랍니다.
UPack 상세 분석 - PE Header 완전 정복 (1)
UPack 상세 분석 - PE Header 완전 정복 (2)
UPack 상세 분석 - PE Header 완전 정복 (3)
UPack 상세 분석 - PE Header 완전 정복 (4)
OllyDbg 실행 에러
UPack 은 IMAGE_OPTIONAL_HEADER 에서 NumberOfRvaAndSizes 값을 A 로 변경(기본값 10)하기 때문에 OllyDbg 의 초기 검증 과정에서 아래와 같은 에러 메시지를 출력합니다.
크리티컬한 에러가 아니므로 [확인] 버튼을 눌러서 넘어갑니다.
<Fig. 2>
어디까지나 OllyDbg 의 버그(혹은 엄격한 PE 체크)때문에 이런 현상이 발생한 것이므로 강제로 EP 를 설정해줘야 합니다.
먼저 EP 가 어디인지 알아야겠죠? Stud_PE 를 이용하여 확인해 보겠습니다.
위 그림을 보면 ImageBase 가 01000000 이고, EP 의 RVA 값이 1018 입니다.
따라서 EP 의 VA 값은 01001018 입니다.
<Fig. 4>
"New origin here" 명령을 실행하면 경고 메시지 박스가 뜨는데 [확인]을 눌러주면, 이제부터 정상적인 디버깅이 가능합니다.
Decoding Loop
모든 Packer 에는 Decoding Loop 가 존재합니다. 압축/해제 알고리즘 자체가 많은 조건 분기와 루프로 구성되어 있다는 걸 알고 계시다면 Decoding Loop 가 왜 그리 복잡하게 보이는지 이해하실 수 있을 것입니다.
EP 코드부터 디버깅을 시작해 보겠습니다.
<Fig. 5>
첫 두 명령은 010011B0 주소에서 4 byte 를 읽어서 EAX 에 저장하는 명령입니다. EAX 는 0100739D 값을 가지는데 이는 원본 notepad 의 OEP (Original Entry Point) 입니다.
우리는 디버깅 실력 향상이 목표이므로 정석대로 계속 진행하겠습니다. (익숙해 지시면 BP 걸고 달리세요~)
조금 진행하다 보면 아래와 같은 함수 호출 코드가 나타납니다.
<Fig. 6>
이때 ESI 값은 0101FCCB 이고 이게 바로 decode() 함수의 주소입니다. 앞으로 이 함수가 반복적으로 호출될 것입니다.
decode() 함수를 살짝 살펴보겠습니다.
이 부분만 봐서는 뭐 하는 코드인지 아직 감이 안 오실 겁니다.
StepIn[F7] 을 계속 하다 보면 아래와 같은 코드를 만나게 됩니다.
<Fig. 8>
0101FE57 과 0101FE5D 주소에는 EDI 값이 가리키는 곳에 뭔가를 쓰는 명령어가 있습니다. 이때 EDI 값은 1st Section 내의 주소를 가리킵니다.
즉, 압축을 해제 한 후 실제 메모리에 쓰는 명령어 들입니다.
실제로 이곳에 BP 를 걸고 달리시면 EDI 가 가리키는 주소에 어떤 값들이 쓰여지는 것을 볼 수 있습니다.
IAT 세팅
일반적인 Packer 에서는 Decoding Loop 가 끝나면 원본 파일에 맞게 IAT 를 새롭게 구성합니다. UPack 도 같은 과정을 거칩니다. 아래 그림을 봐주세요.
<Fig. 9>
UPack 이 Import 하는 2개의 함수 LoadLibraryA 와 GetProcAddress 를 이용하여 루프를 돌면서 원본 notepad 의 IAT 를 구성합니다. (notepad 에서 Import 하는 함수들의 실제 메모리 주소를 얻어서 원본 IAT 영역에 쓰는 것입니다.)
이 과정이 끝나면 0101FEAF 주소의 RETN 명령어로 드디어 OEP 로 갑니다.
수고하셨습니다. 익숙해 질 때 까지 몇 번 반복해 보시기 바랍니다.
이것으로 UPack 의 모든 설명을 마치겠습니다.
질문은 댓글이나 메일을 이용해 주세요~
ReverseCore
'analysis' 카테고리의 다른 글
| UPack 디버깅 - OEP 찾기 (23) | 2009/09/18 |
|---|---|
| UPack 상세 분석 - PE Header 완전 정복 (4) (2) | 2009/09/17 |
| UPack 상세 분석 - PE Header 완전 정복 (3) (4) | 2009/09/14 |
| UPack 상세 분석 - PE Header 완전 정복 (2) (6) | 2009/09/08 |
| UPack 상세 분석 – PE Header 완전 정복 (1) (20) | 2009/09/04 |
| Inline Patch 실습 (2) (4) | 2009/08/27 |
| Inline Patch 실습 (1) (6) | 2009/08/22 |
| UPX 실행 압축된 notepad 디버깅! (27) | 2009/06/16 |
| 키로거(KeyLogger) 분석 (3) (4) | 2009/05/03 |
| 키로거(KeyLogger) 분석 (2) (50) | 2009/05/03 |
| 키로거(KeyLogger) 분석 (1) (14) | 2009/04/24 |
Upack.exe