섹션 헤더를 잘 이해했다면 이제 PE 파일이 메모리에 로딩되었을 때 각 섹션에서 메모리의 주소(RVA)와 파일 옵셋을 잘 매핑할 수 있어야 합니다. 이러한 매핑을 일반적으로 'RVA to RAW'라고 부른다. 방법은 아래와 같다.
1. RVA가 속해있는 섹션을 찾는다.
2. 간단한 식을 사용해서 파일 옵셋(RAW)를 구한다.
RAW - PinterToRawData = RVA - VirtualAddress
RAW = RVA- VritualAddress + PointerToRawData
하나씩 살펴보면 RVA는 각 섹션에서 메모리 주소.
VirtualAddress는 메모리에서 섹션의 시작주소
PointToRawData는 file에서 섹션의 시작주소.
RAW는 각 섹션에서 파일주소 이렇게 보고 다음 예저를 살펴보자
Q1) RVA = 5000 일때 File Offset = ?
A1) 먼저 해당 RVA 값이 속해 있는 섹션을 찾아야 한다.(메모리 영역 기준)
=> RVA 5000는 첫번째 섹션(".text")에 속해있다. (ImageBase 01000000이니 메모리 주소에서 01000000 를 뺀 값을 보면 된다.)
=> RAW = 5000(RVA) - 1000(VirtualAddress) + 400(PointerToRawData) = 4400
Q2) RVA = 13314 일때 File Offset = ?
A2) 해당 RVA 값이 속해 있는 섹션을 찾는다.
=> 세번째 섹션(".rsrc")에 속해있다.
=> RAW = 13314(RVA) - B000(VA) + 8400(PointerToRawData) = 10714
Q3) RVA = ABA8 일때 File Offset = ?
A2) 해당 RVA 값이 속해 있는 섹션을 찾는다.
=> 두번째 섹션(".data")에 속해있다.
=> RAW = ABA8(RVA) - 9000(VA) + 7C00(PointerToRawData) = 97A8(?)
값이 97A8이 나왔는데 이 옵셋은 세번째 섹션(.rsrc)에 속해 있다. RVA는 두번째 섹션이고 RAW는 세번째 섹션이라는건 말이 되지 않는다. 이 경우에는 해당 RVA에 대한 RAW는 정의 할 수 없다고 해야한다. 이러한 결과가 나오는 이유는 위 경우에 두번째 섹션의 VirtualSize값이 SizeOfRawData값보다 크기 때문이다.
'리버스 엔지니어링' 카테고리의 다른 글
IAT란? -2 IMAGE_IMPORT_DESCRIPTOR (0) | 2018.01.19 |
---|---|
IAT란? -1 DLL (0) | 2018.01.18 |
섹션 헤더 (0) | 2018.01.16 |
NT 헤더 -2 (0) | 2018.01.16 |
PE 헤더 -1 (0) | 2018.01.11 |