리버싱

PE 파일의 주요 자료구조 분석 섹션 테이블 실습 CFF Explorer

이둥둥 2025. 2. 21. 15:00

섹션테이블

  • 배열처럼 동일한 자료구조 나열
  • 섹션이 n개면 n개의 IMAGE_SECTION_HEADER가 있음
  • IMAGE_SECTION_HEADER가 모여서 섹션 테이블의 구조
  • 각 섹션의 속성을 확인할 수 있음
  • 프로그램 실행 시 로더에서 PE헤더를 통해 섹션을 먼저 파악함

 

IMAGE_SECTION_HEADER의 구성요소

 

typedef struct _IMAGE_SECTION_HEADER {
  BYTE  Name[IMAGE_SIZEOF_SHORT_NAME];
  union {
    DWORD PhysicalAddress;
    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;

 

Misc.VirtualSize
메모리에 로드될 때 섹션의 총 크기이고, 값이 SizeOfRawData 멤버보다 크면 섹션이 0으로 채워짐

VirtualAddress
이미지 베이스를 기준으로 메모리에 로드될 때 섹션의 첫 번째 바이트 주소

ex) DWORD VirtualAddress; →1000 // 메모리에 올라간 파일의 시작위치로부터 1000만큼 떨어진 위치에 첫 번째 섹션을 매핑


SizeOfRawData
디스크에서 초기화된 데이터의 크기이고 이 값은 IMAGE_OPTIONAL_HEADER 구조체의 FileAlignment 멤버의 배수여야 함. 이 값이 VirtualSize 멤버보다 작으면 섹션의 나머지 부분은 0으로 채워짐


PointerToRawData
COFF 파일 내의 첫 번째 페이지에 대한 파일 포인터, 이 값은 IMAGE_OPTIONAL_HEADER 구조체의 FileAlignment 멤버의 배수여야 함.

ex) DWORD PointerToRawData; → 400 // 파일의 시작 지점부터 정확히 400만큼 떨어진 위치에 첫 번째 섹션이 존재

Characteristics
read, write, excute 등 프로텍션에 대한 정보

 

 


 

CFF Explorer 섹션 테이블 실습

sample_x32.exe 실행 파일을 CFF Explorer에 로드했다

DOS header, NT Header, Section Header 등 헤더들이 확인된다

 

 

COFF 파일 이므로 CFF Explorer 에서 덤프가 가능하고 이전에 보았던 섹션들이 보인다

- .text: 기계어 코드
- .data: 전역변수
- .idata: 임포트 할 api, dll  정보

파일 상에서 위치는 Raw Address
가상 메모리 위치는 Virtual Addres

 

 

s.data의 virtual adress→00003000이지만 이는 오프셋 값이므로

실제 위치는 실행파일이 로드된 주소인 00400000+00003000 = 00403000인 것이 확인됨

 

 

각 섹션들의 Characteristics(protection) 값 확인

 

 

x32 dbg에 로드해도 각 섹션의 프로텍션을 바로 파악할 수 있다!

 

 

요약: 섹션 테이블은 로더를 위해 존재한다고 할 수 있는데,
각 섹션들에 대한 정보가 있어서 그에 따라 로더가 매핑을 하기 때문