반응형
PE 재배치(PE Relocation)
PE 재배치란?
PE(Portable Executable) 파일이 원래 로딩되기를 기대하는 기본 주소인 ImageBase에 로딩되지 못하고, 다른 주소에 로딩될 때 발생하는 작업을 의미함
DLL/SYS 파일에서의 PE 재배치
- DLL/SYS 파일: 예를 들어, TEST.EXE 프로세스에 A.DLL이 10000000 주소에 로딩된 상태에서 B.DLL이 동일한 주소로 로딩되려고 할 때, PE 로더는 충돌을 피하기 위해 B.DLL을 다른 비어있는 주소에 로딩함.
EXE 파일에서의 PE 재배치
- EXE 파일: 실행될 때마다 랜덤한 주소에 로딩되며, 이 과정에서 재배치가 발생할 수 있음. 이는 보안을 위한 ASLR(Address Space Layout Randomization)의 일환
PE 재배치가 발생할 때 수행되는 작업
- 프로그램이 ImageBase에 로딩되지 않았을 때, 하드코딩된 메모리 주소를 현재 로딩된 주소에 맞게 조정해 주는 작업을 의미
- 올리디버거에서 notepad.exe를 재실행하면, 표시된 주소 값은 매번 달라지며, 프로그램은 하드코딩된 주소들을 현재 로딩된 주소로 맞춰야 함. 이를 하지 않으면 프로그램은 제대로 실행되지 않음
PE 재배치 동작 원리
- 하드코딩된 주소 위치를 찾음
- 해당 값을 읽어 ImageBase만큼 뺌
- 현재 실제로 로딩된 주소를 더함
이 과정은 PE 파일 내부의 Relocation Table을 참고하여 하드코딩된 주소들의 옵셋을 찾아 수행
Base Relocation Table
- Base Relocation Table은 하드코딩된 주소들의 옵셋을 모아둔 목록이며, PE 헤더의 DataDirectory 배열에서 여섯 번째 항목에 위치
RVA | Data | Comment |
0002F000 | 00001000 | VirtualAddress |
002F004 | 00000150 | SizeOfBlok |
0002F008 | 3420 | TypeOffset |
0002F00A | 342D | TypeOffset |
0002F00C | 3436 | TypeOffset |
... | ... | ... |
ex) TypeOffset 값이 3420이라면 아래와 같이 해석됨
Type(4bit) | Offset(12bit) |
3 | 420 |
최상위 3bit는 Type으로 사용. PE 파일에서 일반적인 값은 3(IMAGE_REL_BASED_HIGHLOW)이고, 64비트용 PE+ 파일에서는 A(IMAGE_REL_BASED_DIR64)임. TypeOffset의 하위 12비트가 진짜 Offset을 의미하며 Virtual Address 기준 옵셋임.
따라서 하드코딩 주소가 있는 옵셋은
VirtualAddress(1000) + Offset(420) = 1420(RVA)
반응형
'공부해요 > 리버싱_핵심원리' 카테고리의 다른 글
18. UPack PE 헤더 상세 분석 (0) | 2024.10.16 |
---|---|
17. 실행 파일에서 .reloc 섹션 제거하기 (0) | 2024.10.09 |
15. UPX 실행 압축된 notepad 디버깅 (0) | 2024.10.09 |
14. 실행 압축 (0) | 2024.10.08 |
13. PE File Format (1) | 2024.10.02 |