티스토리 뷰
PE(Portable Executable) #05 - PE Header | NT - SECTION_HEADER
live2skull 2016. 8. 10. 16:26NT_HEADER -> SECTION_HEADER
typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress; // Physical Memory에 직접 접근 불가. (deprecated) DWORD VirtualSize; } Misc; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORD Characteristics; } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
0. Name
섹션의 이름. 최소 0바이트 이상, 8바이트 이하까지 사용 가능하다.
다만 이름의 값이 존재하지 않거나(null), 서로 같은 이름의 섹션이 여러개 존재해도 상관없다.
1. VirtualSize
메모리에서 섹션이 차지하는 크기이다.
2. VirtualAddress
메모리에서 섹션이 시작하는 주소이며, RVA로 설정되어 있다.
이 값은 아무 값이나 가질 수 없고, IMAGE_OPTIONAL_HEADER 의 SectionAlignment에 맞게 결정된다.
3. SizeOfRawData
파일에서 섹션이 차지하는 크기이다.
이 값은 아무 값이나 가질 수 없고, IMAGE_OPTIONAL_HEADER 의 FileAlignment에 맞게 결정된다.
4. PointerToRawData
파일에서 섹션이 시작하는 주소이며, 파일의 절대 주소(Offset) 이다.
5. Characteristics
섹션의 특징을 bit OR 연산으로 저장한 값이다. 설정 정보는 다음과 같다.
#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 // Section contains extended relocations.
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded.
#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable.
#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable.
#define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable.
#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable.
#define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable.
#define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable.
WRITE : 해당 메모리 주소(섹션) 의 데이터를 쓸 수(변경) 있음.
EXECUTE : 해당 메모리 주소(섹션) 의 데이터를 실행할 수 있음.
EIP가 해당 섹션의 메모리 주소를 가리키고 있을 때, EXECUTE 권한이 없다면 Permission 오류와 함께 프로그램이 중지된다.
이 권한은 말 그대로 해당 섹션(메모리)에 존재하는 데이터를 opcode로 보아 실행하는 것을 허락할 지의 여부이다.
Section - Windows
일반적인 Windows PE 파일의 섹션 이름과 종류는 다음과 같다.
.text : main을 포함한 프로그램의 동작 코드
.rdata : CONST로 선언된 정적 전역 변수 저장(format string, enum)
.data : CONST를 제외한 전역 변수, Static 으로 선언된 지역 변수.
.idata : IAT(Import Address Table)과 관련된 정보들이 존재한다.
.reloc : Relocation과 관련된 정보들이 존재한다.
여기서 중요한 것은, 이것들은 "일반적으로" 컴파일러가 사용하는 규칙으로, 이러한 규약을 지키지 않아도 프로그램은 정상적으로 동작한다.
역분석을 어렵게 하기 위해 임의적으로 Section을 수정해 사용하기도 한다.
메모리 주소 - PE 파일(disk) 와 상호변환
> 이 공식이 맞는 경우도 있고 틀린 경우도 있다. (VirtualSize / SizeOfRawData 및 Align이 원인이다.)
** RAW : 현재 메모리 주소 - ImageBase
** VirtualAddress : 현재 메모리 주소가 위치하는 섹션의 시작 주소(RVA)
RAW - PointerToRawData = RVA - VirtualAddress RAW = RVA - VirtualAddress + PointerToRawData
참고:
'System > Windows' 카테고리의 다른 글
PE(Portable Executable) #07 - PE Header | EAT (0) | 2016.08.11 |
---|---|
PE(Portable Executable) #06 - PE Header | IAT / IMPORT_DESCRIPTOR (0) | 2016.08.10 |
PE(Portable Executable) #04 - Virtual Address | FILE OFFSET (0) | 2016.08.10 |
PE(Portable Executable) #03 - PE Header | NT - OPTIONAL_HEADER (0) | 2016.08.10 |
PE(Portable Executable) #02 - PE Header | NT - FILE_HEADER (0) | 2016.08.09 |