한님폐하 2022. 9. 13. 11:55

1. PE 재배치 

  • 실행 파일이 로드될때 ImageBase에 다른 실행 파일이 로드되어 있다면, 중첩되는 문제가 발생된다.
  • 이런 문제를 해결하기 위해서 로더는 ASLR 기능에 의해서 다른 주소를 찾아서 해당 주소로 실행 파일을 로드한다.
  • 이때, 로드되는 주소가 변경되면 절대 주소 값을 변경된 주소로 수정되어야 한다.
  • 이렇게 변경된 주소 정보를 '.reloc' 섹션에 저장하여 다른 실행 프로그램과 중첩되지 않도록 동작한다.
  • 즉, PE 재배치는 프로그램에 하드코딩된 메모리 주소를 현재 로딩된 주소에 맞게 수정해주는 기능을 의미한다.
  • DLL 파일이 로드될때 이미 그 주소에 다른 DLL이 로드된 경우, PE 재배치를 통해서 다른 주소에 로드된다.




2. PE 재배치 위치 확인

  • PE 재배치 위치를 확인하려면, 다음과 같은 요소를 파악한다.
    • ImageBase
    • .reloc 섹션의 RVA 주소
    • Base Relocation Table
    • 프로그램 실행시 ImageBase 대역
  • ImageBase 확인
    • IMAGE_NT_HEADER -> IMAGE_OPTIONAL_HEADERS -> Image Base
    • 0x01000000
  • .reloc 섹션의 RVA 주소 확인
    • IMAGE_NT_HEADER -> IMAGE_OPTIONAL_HEADERS -> Number of Data Directories -> BASE
    • RELOCATION Table -> RVA
    • IMAGE_SECTION_HEADER .reloc -> RVA
    • 0x000BC000
  • Base Relocation Table 확인
    • SECTION .reloc -> IMAGE_BASE_RELOCATION
    • RVA 0x1000 위치에 재배치할 주소가 0xB4(180byte) 크기 만큼있다는 의미이다.
      • RVA of Block 0x00001000
      • Size of Block 0x000000B4
      • Type RVA 0x3000+0x0641(Offset)
  • 프로그램 실행시 ImageBase 대역
    •  'calc.exe'를 올리디버거 오픈 -> 맨 위로 올려서 확인
    • 0x00911000



3. PE 재배치 구하기

 ① 프로그램에서 하드코딩된 주소(재배치될 주소) 위치를 찾는다.
 ② 하드코딩된 주소(재배치될 주소)에서 ImageBase 값을 뺀다.
 ③ 실행 파일이 로드될때 ImageBase 대역에 위의 ② 주소 값을 더한다.

  • 하드코딩된 주소(재배치될 주소)가 있는 오프셋 구하기
    • ImageBase 0x01000000
    • RVA of Block 0x00001000
    • Size of Block 0x000000B4
    • Type RVA 0x3000+0x0641(Offset)
      • 하드코딩된 주소가 있는 오프셋 = RVA of Block + Offset
      • 하드코딩된 주소가 있는 오프셋 = 0x00001000 + 0x0641 = 0x00001641
    • PEview 주소 보기를 RVA로 변경한 이후 '0x00001641' 위치로 이동하여 재배치될 4byte 주소 값을 확인한다.
    • SECTION .text -> '0x0001641' 위치의 4byte 주소 값 확인 -> 64 40 05 01

 

  • 하드코딩된 주소(재배치될 주소)에서 ImageBase 값 빼기
    • 하드코딩된 주소값이 저장된 오프셋 4byte 주소 값 리틀 엔디언
    • 0x00001641 64 40 05 01 01 05 40 64
      • 0x01054064 - 0x01000000 = 0x00054064

 

  • 파일이 로드될때 ImageBase 대역에 '0x00054064' 주소 값을 더하기
    • 0x00911000 + 0x00054064 = 0x00965064
  • 올리디버거 코드창에서 '0x00965064'로 이동(Ctrl+g)하여 재배치된 주소에 코드를 확인한다.
    • 00965064    06              PUSH ES
  • 이런 과정을 모든 Type+Offset에 대해서 반복적으로 진행하여 Type+Offset 값이 '0'이 되면 하나의 IMAGE_BASE_RELOCATION 구조체 동작은 종료된다.
댓글수0