Reversing

나뭇잎책 정리 UPACK

BIGFROG 2020. 3. 17. 20:19

왼쪽(원본 노트패드) / 오른쪽(UPACK을 통해 패킹된 노트패드)

IMAGE_OPTIONAL_HEADER의 크기(SizeOfOptionalHeader)가 원본에서는 E0인데 패킹된 파일에서는 0148이다.

 

패킹된 파일에서 SizeOfOptionalHeader값이 0x0148이기 때문에,

섹션 헤더(IMAGE_SECTION_HEADER)의 시작 오프셋이 바뀌게 된다.

 

(원본 노트패드에서는 IMAGE_OPTIONAL_HEADER 구조체가 0xF8부터 시작하는데,

패킹된 노트패드의 경우에는  IMAGE_OPTIONAL_HEADER 구조체가 0x28부터 시작함.)

 

=> IMAGE_OPTIONAL_HEADER 시작 오프셋인 0x28+

SizeOfOptionalHeader의 값인 0x148 = 0x170이다.(섹션헤더 오프셋)

 

 

*UPACK의 특징 : PE헤더를 꼬아놓고 헤더 안에 디코딩에 필요한 코드를 끼워 넣음.

SizeOfOptionalHeader 값을 늘려줬기 때문에, IMAGE_OPTIONAL_HEADER와 IMAGE_SECTION_HEADER 사이에 공간이 생김.

 

 

IMAGE_OPTIONAL_HEADER의 끝이 D7?

IMAGE_OPTIONAL_HEADER의 멤버인 NumberOfRvaAndSizes의 값이 0A이다.

이는 나뭇잎책 p.158에서 확인해보면,

number of directories라고 설명되어 있다. 바로 다음부터 등장하는 data directory의 개수를 의미한다.

데이터 디렉토리는 각각 4byte RVA와 4byte size로 구성되어 있다.

따라서, 0x0A * (4+4) 만큼의 디렉토리가 할당되어 있다.

 

A*8 = 0x50이 된다.

IMAGE_OPTIONAL_HEADER의 끝은 0x87 + 0x50 = D7이라는 것을 알 수 있다.

 

hex editor를 이용해서 영역을 표시하면,

D8부터 170전까지이고, 이 공간에 무언가 쓰여져 있는 것을 알 수 있다.

이 공간에는 Data Directory + UPACK디코딩 코드가 들어간다

 

일단 section의 개수는 3개임을 알 수 있다.

 

UPACK은 섹션과 헤더를 마구 겹쳐쓰는 특징이 있음.

 

섹션1과 섹션3의 RawOffset과 RawSize가 같다. = 파일 시작 오프셋과 파일에서의 크기가 같다.

또한, 오프셋이 10인데 이는 헤더 영역이다.

따라서, 이 프로그램이 실행될 때 PE 로더는 오프셋 0~1FF영역을 메모리의 헤더, 첫 번째 섹션, 세 번째 섹션에 각각 매핑하게 된다.

=> 같은 파일 이미지를 가지고 각각 다른 위치와 다른 크기의 메모리 이미지를 만들 수 있다.

 

 

...

 

OEP찾기

ImageBase = 0100 0000

RVA = 0000 1018이므로

올리에 올린 후에 0100 1018을 EP로 설정해줘야 한다.

New origin here을 통해 강제로 EIP를 변경해주면 된다.

'Reversing' 카테고리의 다른 글

[코드엔진] Advance 06  (0) 2020.03.22
[Ap0x] unpackme.exe 인라인 패치  (0) 2020.03.22
지뢰찾기(winmine.exe) 분석  (0) 2020.03.17
[코드엔진] Advance 4  (0) 2020.03.12
[코드엔진] Advance 3  (0) 2020.03.11