이번 리버싱 스터디 5주차에는 14-15강을 듣고 내용을 정리한 후 어려웠던 부분을 공유하며 질문을 통해 해결하는 시간을 가졌다.
참고한 유튜브 영상:
https://www.youtube.com/playlist?list=PLY12b4RRLcSdsxgVvTW3mnNzMjVrd8JhO
<14강: Section Header>
Section Header란? 각 섹션의 속성을 정의한 것
- code, data, rsrc 3가지 섹션으로 나눠어서 저장한다. (프로그램 복잡함 감소, 프로그램 안전성을 위해서)
- ⇒ 각 섹션마다 특성의 권한이 주어진다.
- code: 실행. 읽기 권한
- data: 비실행. 읽기 권한
- rsrc: 비실행. 읽기 권한 (resource의 약자)
- IMAGE_SECTION_HEADER가 3개의 세션을 관리한다.
IMAGE_SECTION_HEADER {
DWORD VirtualSize; #메모리에서 섹션이 차지하는 크기
DWORD VirtualAddress; #메모리에서 섹션의 시작주소 (RVA=상대주소)
DWORD SizeOfRawData; #파일에서 섹션이 차지하는 크기
DWORD PointerToRawData; #파일에서 섹션의 시작주소
DWORD Characteristics; #섹션의 속성을 (Bit OR)로 저장
}
WORD Characteristics = 파일의 속성을 저장(Bit OR)
DWORD Characteristics = 섹션의 속성을 저장(Bit OR)
- Virtual이 붙은 것은 메모리, 그 외는 파일에서 시작한다.
- VirtualAddress(=SectionAlignment): 메모리에서 섹션의 시작 위치. 절대주소(VA) 아님 주의!
- PointerToRawData(=FileAlignment): 파일에서 섹션의 시작 위치
<15강: RVA to RAW>
- RVA TO RAW: PE파일이 메모리에 로딩되었을 때 각 섹션에서 메모리의 주소(RVA)와 오프셋을 매핑하는 것.
- ex) char A[] = abcdef일때 c는 A시작점에서 2의 오프셋을 가진다.
- 용어 정리
- RAW(File Offset): 오차범위
- 매핑: 하나의 값을 다른 값으로 대응시키는 것
- 로딩: 매핑을 실제로 하는 것
- 매핑 순서:
- RVA가 속해 있는 섹션 찾기
- 공식을 이용해서 파일 오프셋(RAW)을 계산한다.
- RAW = RVA - VA + PointerToRawData,
- RAW - PointerToRawData = RVA - VA
연습)
1. RVA = 3000일 때 RAW는? (16진수 계산기 用)
큰 값 - 작은 값 = offset
작은 값 - 큰 값 = 오버플로우
3000 - 400 = 2C00, 3000 - 53200 = FFFF FFFF FFFA FE00 이므로 400보다는 크고, 53200보다는 작은걸 알 수 있다 => RVA는 Section (".text") 에 속한다.
PointerToRawData = 00000400, VA = 01001000 이므로, 3000 - 01001000 + 00000400 = FFFF FFFF FF00 2400
공식에 맞게 했지만 Image Base 를 고려하지 않아서 잘못된 결과가 나온다.
ImageBase = 01000000 이다. Offset과 VA의 시작주소는 다르기 때문에 맞춰주기 위해 VA - ImageBase 하여 1000이라는 값이 나온다.
(파일은 0000000으로 시작하는데 VA는 01000000으로 시작한다)
(공식) RAW = RVA - VA + PointerToRawData = 3000 - 1000 + 400 = 2400
2. RVA = BC123일 때 RAW는?
RVA는 Section (".reloc")에 속한다.
PointerToRawData = B9C00
VA = 010BC000
VA - ImageBase = BC000
(공식)RAW = BC123 - BC000 + B9C00 = B 9D23
3. RVA = ABA8 일 때, RAW는?
PointerToRawData = 400
VA = 1000 (ImageBase 뺀 )
(공식) RAW = ABA8 - 1000 + 400 = 9FA8
File Offset이 말도 안 되게 떨어져있는 경우, section data가 section rsrc로 매핑 된다는 뜻으로
RVA에 대한 RAW를 정의할 수 없다고 한다.
'2. Reversing (리버싱)' 카테고리의 다른 글
[2024.05.25] 리버씽씽카 7주차 활동 (0) | 2024.05.24 |
---|---|
[2024.05.18] 리버씽씽카 6주차 활동 (0) | 2024.05.19 |
[2024.04.06] 리버씽씽카 4주차 활동 (0) | 2024.05.04 |
[2024.03.30] 리버씽씽카 3주차 활동 (0) | 2024.03.30 |
[2024.03.23] 리버씽씽카 2주차 활동 (1) | 2024.03.23 |