공부해요/리버싱_핵심원리

16. Base Relcoation Table

yenas0 2024. 10. 9. 03:15
반응형

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 재배치 동작 원리

  1. 하드코딩된 주소 위치를 찾음
  2. 해당 값을 읽어 ImageBase만큼 뺌
  3. 현재 실제로 로딩된 주소를 더함

이 과정은 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)

반응형