IT 그리고 정보보안/Knowledge base

PE File Format - 2

plummmm 2021. 4. 18. 20:28
반응형

저번에 이어 PE파일 포맷에 대해 알아보겠습니당

이번에는 섹션 헤더들에 대해 알아볼 것임.

 

저번에 썼던 그림 재활용 한번 하겠습니다..

 

PE파일 포맷에서는 데이터들을 

data, code, rdata 등의 "섹션"을 나누어 따로 저장한다고 했었다. (섹션명 변경가능)

이렇게 섹션을 나누어 저장하는 이유는

효율적인 관리, 프로그램의 안정성 때문이다. (진짜 이유는 만든 사람이 알겠지..)

 

각각의 섹션들은 각자 자신의 헤더를 가지고 있다. 

그것이 섹션헤더. 한번 알아봅시다.

 

* IMAGE_SECTION_HEADER

각 섹션들의 섹션 헤더에 무엇이 들어있는지 확인해보자.

구조는 모든 섹션헤더가 똑같이 생겨 먹었다.

 

위와 같은 여러가지 필드들을 품고 있다.

헥사코드를 보고 실제로 어떤식으로  구성되어 있는지 한번 확인해 보겠음.

 

각 섹션의 이름으로 시작한다. ( 여기선 .text)

그리고 다음 섹션이 나오기전에 끝남.

그라믄 이제 필드값들에 대해 자세히 알아보자. 필요한 필드만 골라서 설명하겠다.

 

1. Name

섹션의 이름을 나타내는 필드이다.

 

2. Virtual Size

메모리에 로드되고 난 후에 섹션이 메모리에서 차지하는 크기를 나타낸다.

 

3. RVA

이전 포스트에서 설명했던 RVA(Related Virtual Address)를 말한다.

IMAGE_OPTIONAL_HEADER 의 ImageBase 값을 기준으로 얼마 떨어져 있는지의 offset값이다.

 

4. Size Of Raw Data

메모리에 로드 되기 전 파일 상태일 때 섹션이 차지하는 크기를 나타내는 필드이다.

IMAGE_OPTIONAL_HEADER 의 FileAlignment 필드값의 배수로 크기를 갖게 된다.

​나중에 RAW와 RVA 맵핑에 대한 설명을 따로 하겠음.

 

5. Pointer to Raw Data

파일 상태의 섹션이 시작하는 위치 즉, offset값을 담고 있는 필드이다.

이것도 IMAGE_OPTIONAL_HEADER 의 FileAlignment 필드값의 배수로 크기를 갖게 된다.

 

 

6. Characteristics

섹션의 속성에 대한 필드이다.

이 필드는 아래 나와있는 속성 값들의 조합으로 이루어 진다.

-----------------------------------------------------------------------------------------

#define IMAGE_SCN_CNT_CODE                   0x00000020  // 코드로 채워진 섹션

#define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // 데이터 초기화 된 섹션

#define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  // 데이터 초기화 되지 않은 섹션

#define IMAGE_SCN_MEM_EXECUTE                0x20000000  // 실행권한이 있는 섹션

#define IMAGE_SCN_MEM_READ                   0x40000000  // 읽기권한이 있는 섹션

#define IMAGE_SCN_MEM_WRITE                  0x80000000  // 쓰기권한이 있는 섹션 

-----------------------------------------------------------------------------------------

 

이렇게 필드에 값을 알아보았다.

섹션 헤더를 알아보았다. 그럼 이제 

파일 상태 --> 메모리 로딩 과정을 정확하게 알아보자.

이런 맵핑 과정을 "RAW to RVA" 라고 한다.

 

뭐일단 결과적으로는 이런 공식이 나온다.

다만 이 공식을 적용할 수 있는 것은 Virtual size와 SizeOfRawData 값이 같을 때이다.

웬만하면 대부분 같은 값을 가진다.

 

RAW - Pointer to RAW data = RVA - Virtual Address

RAW = RVA - Virtual Address + Pointer to RAW data 

 

RAW = File offset을 나타낸다. PE파일 포맷에서는 이 파일 옵셋을 구하는 것이

매우 중요하다.

 

PE 파일 포맷에 대해 자세한듯 간단하게 알아봤는데,

아직 다 하려면 멀었다.

다음엔 IAT, EAT 테이블에 대해 자세히 알아보겠음.

반응형

'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글

윈도우 공유 폴더 종류  (0) 2021.04.18
윈도우 서버 파일 백업  (0) 2021.04.18
PE File Format - 1  (0) 2021.04.18
DLL (Dynamic Link Library)  (0) 2021.04.18
윈도우 XP 은폐 계정 생성  (0) 2021.04.18