Rev
리버싱 핵심원리 16장
2024. 9. 28. 22:50

16. Base Relocation Table

PE 재배치

  • PE 파일이 ImageBase에 로딩되지 못하고 다른 주소에 로딩될 때 수행되는 일련의 작업
    • PE파일 (exe/dll/sys) 이 프로세스 가상 메모리에 loading 될 때 PE헤더의 ImageBase 주소에 로딩된다.
      • dll(sys) 경우, ImageBase위치에 이미 다른 파일이 로딩되어있다면 다른 비어있는 주소로 로딩된다. ⇒ PE 재배치

ASLR (Address Space Layout Randomization )

  • exe 파일이 실행될 때마다 랜덤한 주소에 로딩하는 것

PE 재배치 발생시 수행되는 작업

  1. PEview로 ImageBase 주소 확인

ImageBase : 01000000
imagebase : 01000000 기준으로 하드코딩된 주소

2. ollydbg 로 ep 코드 확인

https://chive0402.tistory.com/5

  • 이렇게 네모친 부분의 주소가 이미지베이스 주소가 아닌, 로딩된 주소 기준으로 하드코딩됨.
    • 위에 두개는 .text 섹션의 IAT 영역이고, 밑에는 .data섹션의 전역변수이다.
  • Ctrl+f2로 재실행할 때마다 위 그림의 하드코딩된 메모리 주소는 로딩된 주소에 맞게 변경된다. ⇒ PE 재배치

EP(Entry Point)란?

Windows 실행파일(exe, DLL 등)의 코드 시작점을 의미, 프로그램이 실행될때 CPU에 의해 가장 먼저 실행되는 코드 시작위치

  • breakpoint : f2
  • 실행 : f9
  • view - breakpoints 원하는 bp선택시 이동

PE 재배치 기존 동작 원리?

💡PE 재배치 작업의 기본 동작 원리

1. 프로그램에서 하드코딩된 주소 위치 찾기
2. 값을 읽은 후 ImageBase 만큼 빼기 (VA→RVA)
3. 실제 로딩 주소를 더하기 (RVA→ VA)
TypeOffset값이 0이 될때까지 해당 과정 반복
  • 하드코딩된 주소 위치는 어떻게 찾냐?
    •  PE파일 내부의 Relocation Table로 찾아가기 (하드코딩 주소들의 위치를 모아놓은 목록)
      • Base Relocation Table 항목 따라가기

Base Relocation Table : PE헤더의 Image DataDirectory[5]에 위치

  • Base Relocation Table 주소가 RVA 2F000임을 알 수 있음 (SECTION .reloc에서 확인가능) 

  • virtual address 값이 1000 즉, Typeoffset 배열의 기준주소(시작주소)는 RVA 1000
  • sizeofblock 값이 150, 즉, 블록전체 크기가 150
  • 아래의 type offset의 값은 type(4 bit) + offset(12 bit)
    • 3420 → type 3, offset 420
  • type ?
    • PE파일에선 3 (IMAGE_REL_BASED_HIGHLOW)
    • PE+ 파일에선 A (IMAGE_REL_BASED_DIR64)
      • 재배치 과정을 방해하려고 이를 0으로 바꾸는 악성코드도 있음..
  • offset ?
    • vitual address 기준의 옵셋
    • 하드 코딩 주소가 있는 옵셋 계산?
      • VirtualAddress(1000) + Offset(420) = 1420 (RVA)
      • 재배치하면.. 로딩된주소 + offset

IMAGE_BASE_RELOCATION 구조체

//IMAGE_BASE_RELOCATION 구조체

//
// Based relocation format.
//

typedef struct _IMAGE_BASE_RELOCATION {
     DWORD VirtualAddress;
     DWORD SizeOfBlock;
//   WORD TypeOffset[1];
} IMAGE_BASE_RELOCATION;

typedef IMAGE_BASE_RELOCATIONUNALIGED * PIMAGE_BASE_RELOCATION;

//
//  Based relocation types.
//

#define IMAGE_REL_BASED_ABSOLUTE
#define IMAGE_REL_BASED_HIGH
#define IMAGE_REL_BASED_LOW
#define IMAGE_REL_BASED_HIGHLOW
.
.
.
// VirtualAddress : Base address , 실제 RVA
// SizeOfBlock : 각 단위 블록의 크기
// 주석 TypeOffset[1]
	//이 구조체 밑으로 WORD 타입의 배열(하드코딩된 주소들의 옵셋)이 따라온다 라는 뜻

 

'Rev' 카테고리의 다른 글

리버싱 핵심원리 21장 ~ 23장  (0) 2024.11.04
리버싱 핵심원리 20장  (0) 2024.10.06
리버싱 핵심원리 2부  (0) 2024.09.23
KnockOn Bootcamp ROP  (0) 2024.09.18
KnockOn Bootcamp memory mitigation bypass  (0) 2024.09.18
let textNodes = document.querySelectorAll("div.tt_article_useless_p_margin.contents_style > *:not(figure):not(pre)"); textNodes.forEach(function(a) { a.innerHTML = a.innerHTML.replace(/`(.*?)`/g, '$1'); });