본문 바로가기

리버스엔지니어링

PE 구조 정리-2

저번 PE 구조 분석에 이어서 이번에는 Section header와 Section에 대해서 분석을 해보겠습니다.

1) Section header

이부분이 바로 Section header부분입니다.

Section header 구조체가 하는 일은 각 Section을 분리시키고, Section들의 속성, 크기, 시작 위치 등 등을 정하는 곳입니다.


#define IMAGE_SIZEOF_SHORT_NAME              8

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;

구조체로 살펴보면 이렇게 구조체가 되있습니다.

여기서 중요한 것은 VirtualSize, VirtualAddress, SizeOfRawData, PointerToRawData, Characteristics 입니다.

1. VirtualSize

이부분은 메모리에서 Section의 크기가 저장되어있습니다.

2. VirtualAddress

이부분은 메모리에서 Section의 시작주소가 RVA값으로 저장되어있습니다.

3. SizeOfRawData

이부분은 파일에서 Section의 크기가 저장되어있습니다.

4. PointerToRawData

이부분은 파일에서 Section의 시작주소가 RVA값으로 저장되어있습니다.

5. Characteristics

이부분은 NT header부분의 Characteristics랑 같은 역할을 합니다.

#define IMAGE_SCN_CNT_CODE                   0x00000020  // Section contains code.
#define IMAGE_SCN_CNT_INITIALIZED_DATA       0x00000040  // Section contains initialized data.
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  // Section contains uninitialized data.
#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.

이러한 여러 속성들을 bit OR형식으로 조합해서 저장해놓습니다.


간단하게 text부분만 정리를 해보면

name : .text (2E 74 65 78 74 00 00 00)

virtual size : 00052CA1

VirtualAddress : 00001000

SizeOfRawData : 00052E00

PointerToRawData : 00000400

PointerToRelocations : 00000000

PointerToLinenumbers : 00000000

NumberOfRelocations : 0000

NumberOfLinenumbers : 0000

Characteristics : 60000020 ( IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_CNT_CODE)

이렇게 됩니다.


이제 각 Section의 header에 대해서 공부를 해봤으니 Section에 대해서도 봐봐야 겠죠 ?? 

2) Text Section

IMAGE_OPTIONAL_HEADER구조체에서 filealignment가 200이였으므로 200의 배수부터 text section이 시작될텐데 200에는 아직 Section header가 있으므로 400부터 Text Section이 시작됩니다.

68 04 82 73 , 08 57 88 73 등 등이 이제 기계어 코드인데요, 실제로 디버거, 디스어셈블러같은 경우는 이 기계어를 어셈블리어로 변환시키는 작업을 합니다.


- 이부분은 이제 디버거와의 비교를 하는 사진입니다.

조금 다른부분이 68 04 82 73이 18 04 DB 75 로 조금 다른데 이부분같은 경우는 dll을 로딩하는 부분이라서 살짝 다른것 같습니다.

(일단 절대주소로 되어있지 않고, dll부분은 계속 relocation되니까 주소가 달라지는것 같습니다.)

3) Data Section


이부분은 Data Section의 일부분을 캡쳐해봤습니다.

지금 분석하고 있는 프로그램이 calc.exe 즉 계산기 이므로 sin, cos, tan를 쓰니까 data에 이러한 값이 있는것을 볼 수 있습니다.


이렇게 여러 Section들로 나누어서 파일들의 내용을 이루는 것을 보았습니다.

음 끝을 어떻게 내야할 지 모르겠다.

끝!

'리버스엔지니어링' 카테고리의 다른 글

간단한 리버싱 워게임-1  (0) 2014.04.11
reversing.kr 44위 달성!  (0) 2014.01.27
PE 구조 정리-1  (0) 2013.07.16
레지스터 정리  (2) 2013.07.11