본문 바로가기
reversing

Base Relocation Table

by 코끼리_땃쥐 2022. 12. 14.
반응형

PE 재배치 

PE파일(EXE/DLL/SYS)이 프로세스 가상 메모리에 로딩(Loading)될 때 PE헤더의 ImageBase주소에 로딩 됩니다. DLL(SYS) 파일의 경우 ImageBase 위치에 이미 다른 DLL(SYS) 파일이 로딩 되어 있다면 다른 비어 있는 주소 공간에 로딩됩니다. 이것을 PE파일 재배치 라고 합니다. 즉 PE재배치란 PE파일이 ImageBase에 로딩되지 못하고 다른 주소에 로딩될 때 수행되는 일련의 작업들을 의미합니다.

 

EXE

프로세스가 생성될 때 EXE 파일이 가장 먼저 메모리에 로딩되기 때문에 EXE에서는 재배치를 고려할 필요가 없었습니다.

그러나 Windows Vista이후부터는 보안 강화를 위해 ASLR(Address Space Layout Randomization) 기능이 추가 되었습니다. 이것은 EXE파일이 실행될 때마다 랜덤한 주소에 로딩하는 것입니다.

※ ASLR 기능은 DLL/SYS 파일에도 적용되는 개념입니다. MS에서는 각 OS의 주요 시스템 DLL들에 대해 버전별로 각자 고유한 ImageBase를 부여하였습니다. 따라서 한 시스템에서 kernel32.dll, user32dll 등은 자신만의 고유 ImageBase에 로딩되기 때문에 실제로 시스템 DLL들끼리는 Relocation이 발생할 일이 없습니다.

 

PE 재배치 동작 원리

프로그램에서 하드 코딩된 주소 위치를 찾는다.
값을 읽은 후 ImageBase만큼 뺀다(VA -> RVA)
실제 로딩 주소를 더한다(RVA -> VA)

여기서 핵심은 하드코딩된 주소 위치를 찾는 것입니다. 이를 위해 PE 파일 내부에 Relocation Table 이라고 하는 하드 코딩 주소들의 옵셋(위치)을 모아 놓은 목록이 존재합니다(Relocation Table은 PE 파일 빌드(컴파일/링크) 과정에서 제공 됩니다.). Relocation Table로 찾아가는 방법은 PE 헤더의 Base Relocation Table 항목을 따라가는 것 입니다.

 

Base Relocation Table

Base Relocation Table 주소는 PE 헤더에서 DataDirectory 배열의 여섯 번째 항목에 들어있습니다(배열 index는 5)

 

IMAGE_NT_HADERS / IMAGE_OPTIONAL_HEADER / IMAGE_DATA_DIRECTORY[5]

 

IMAGE_BASE_RELOCATION 구조체

Base Relocation Table은 IMAGE_BASE_RELOCATION 구조체 배열입니다.

typedef struct _IMAGE_BASE_RELOCATIOIN {
 	DWORD	VirtualAddress;
    DWORD	SizeOfBlock;
 // WORD	TypeOffset[1];
} IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;

#define IMAGE_REL_BASED_ABSOLUTE	0
#define IMAGE_REL_BASED_HIGH		1
#define IMAGE_REL_BASED_LOW		2
#define IMAGE_REL_BASED_HIGHLOW		3
#define IMAGE_REL_BASED_HIGHADJ		4
#define IMAGE_REL_BASED_MIPS_JMPADDR	5
#define IMAGE_REL_BASED_MIPS_JMPADDR16	9
#define IMAGE_REL_BASED_IA64_IMM64	9
#define IMAGE_REL_BASED_DIR64		10

IMAGE_BASE_RELOCATION 구조체의 첫 번째 멤버 VirtualAddress는 기준 주소(Base Address)이며, 실제로 RVA값입니다. 두 번째 멤버 SizeOfBlock은 각 단위 블록의 크기를 의미합니다. 마지막으로 구조체 멤버는 아니지만 주석으로 표시된 TypeOffset 배열의 의미는 이 구조체 밑으로 WORD 타입의 배열이 따라 온다는 뜻입니다. 그리고 이 배열 항목의 값이 바로 프로그램에 하드코딩된 주소들의 옵셋입니다.

반응형

'reversing' 카테고리의 다른 글

notepad.exe 프로세스 숨기기 성공 !!  (0) 2023.01.12
DLL 인젝션  (0) 2023.01.02
IAT & EAT  (0) 2022.12.12
PE File Format 중요 멤버 간단정리  (0) 2022.12.05
IMAGE_FILE_HEADER - OPTINAL_HEADER  (0) 2022.11.29

댓글