반응형

PE파일이 메모리에 로딩 되었을 때 각 섹션에서 메모리와 파일 옵셋을 잘 매핑할 수 있어야 한다.

 

이러한 매핑을 "RVA to RAW" 라고 부른다.

 

  1. Image Base
  2. RVA
  3. VA
  4. PointerToRawData

 

이 4개의 값으로 식을 세우면 실제 파일 오프셋의 위치를 알 수 있다.

쉽게 메모리에 파일이 실행 되고 있을때, 오프셋의 실제 주소를 알 수 있다.

 

식은 이러하다.

RAW - PointerToRawData = RVA - VirtualAddress

RAW = RVA - VirtualAddress + PointerToRawData

 

  1. RVA가 속해 있는 섹션을 찾는다.
  2. 간단한 비례식을 사용해서 파일 옵셋(RAW)을 계산한다.

 

RVA = 5000h; File Offset = ?
RVA 10005000 는 첫번째 섹션(".text")에 속해있다. 하지만 Imagebase가 01000000이므로 RVA = 00005000
00005000(RVA) - 00001000(VirtualAddress) + 00000400(PointerToRawData) = 00004400(RAW)

이렇게 딱딱 맞아 떨어지는 경우도 있지만, VirtualSize 와 SizeOfRawData 값이 서로 틀려서 값이 떨어지지 않는 경우도 있다. 이것을 RAW의 값은 정의할 수 없다 라고 한다.

 

 

 

아래에서 직접 해보면서 깨달아보자

예제는 Reversing.kr의 1번 문제의 특정 문자열이 offset상에서 어디에 있는지 찾아보는 것을 하겠다.

1. 해당 파일의 ImageBase는 00400000이다.

 

 

2. "R3versing"을 offset에서 찾아보기로 하고 이 문자열의 RVA를 구한다. RVA가 0040606C으로 보이지만 ImageBase를 빼면 0000606C이다.

 

 

3. "R3versing"문자열은 .data섹션에 있을 것이니 .data섹션의 VA를 구해야하는데, PE View에서는 RVA가 00006000이므로 VA도 00006000이다. (디버거에서는 004006000으로 뜨지만 PE View에서는 RVA를 계산해서 보여주는듯 하다.)

 

4. 마지막으로 PointerToRawData를 구해야 하는데, PE View를 보면 RVA의 값과 같게 설정 되어 있다.

 

 

("R3versing"문자열의 RVA) = 0000606C

(.data섹션의 VirtualAddress) = 00006000

(파일에서.data섹션의 시작 위치 즉, PointerToRawData) = 00006000

 

 

이것을 식으로 확인해보면.. ("R3versing"0000606C(RVA)) - 00006000(.data섹션의 VA) + 00006000(파일에서 .data섹션의 시작 위치) = 0000606C(Offset)

 

실제로 있는지 HxD로 보면

0000606C에 "R3versing" 문자열이 있는 모습이다.

 

 

 

 

 

다음에는 IAT 하겠습니다.

반응형

'윈도우 > PE 구조' 카테고리의 다른 글

PE 구조 (7) - EAT  (0) 2022.05.02
PE 구조 (6) - IAT  (0) 2022.04.19
PE 구조 (4) - (Section Header)  (0) 2022.04.02
PE 구조 (3) - (NT Header)  (0) 2022.03.31
PE구조 (2) - (DOS Header, DOS Stub)  (0) 2022.03.30