티스토리 뷰

NT_HEADER -> SECTION_HEADER

Section 이란?
PE파일(프로그램) 에는 다양한 것들이 들어간다. 
main 및 각종 프로그램의 동작을 정의하는 함수들의 코드들, 전역 변수로 설정된 데이터나 프로그램 안에 들어가 있는 문자열 (예: 포맷 스트링), 그리고 프로그램 안에 이미지를 같이 포함시켜 리소스 형태로 저장할 수 도 있다.

PE에서는 이런 코드와 데이터들을 한꺼번에 모아놓지 않고, 각각 그 특성과 필요에 맞추어 각각의 데이터들을 "섹션" 으로 나누어 따로 따로 저장하며,
이러한 섹션에는 Read/Write/Execute 이 세가지의 권한 옵션이 주어진다.


IMAGE_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.
여기서 중요한 것은 READ, WRITE, EXECUTE 이 세 가지 권한이며, 이것들은 특히 보안에서 중요하게 사용된다.
READ : 해당 메모리 주소(섹션) 의 데이터를 읽을 수 있음.

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


참고:

http://www.reversecore.com/22

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함