-
PE 구조 (6) - 계산기의 PE 구조 / SECTION HeaderKnowledge/Reversing 2019. 9. 26. 13:07
오늘은 계산기의 SECTION HEADER 구조에 대해서 공부할 차례이다.
이번 챕터를 지나고 나면 저번글에서 언급하지 못했던 Image data directory를 볼 것이다.
우선 섹션 해더의 구조를 살펴보자.
#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;
#define IMAGE_SIZEOF_SECTION_HEADER 40섹션 헤더의 사이즈는 40이라고 적혀있다.
사실인지 직접 계산해서 확인해보자.
1 * 8 + 2 * 2 + 4 * 7 = 40
네. 그렇습니다... 크흠
우리가 주로 봐야할 변수들을 확인해보면
Name[8] : ex) .text
VirtualSize : 메모리 상에서 차지하는 크기
ViratualAddress : 메모리 상에서 섹션의 시작 주소(RVA)
SizeOfRawData : 파일 상에서의 section이 차지하는 크기
PointerToRawData : 파일 상에서의 section의 시작 위치
Charicteristics : 섹션의 속성섹션 헤더가 3개 존재한다는 것을 이전 글을 통해서 확인한 바가 있다.
https://shineild-security.tistory.com/72?category=1047174
winhex를 통해서 각각의 섹션 헤더값들을 확인해 보자.
첫번째 SECTION HEADER
NAME[8] : 2E 74 65 78 74 (.text)
딱히 설명할 필요가 사실 없는 부분이다.
이 섹션의 이름은 .text라는 것을 알려준다.
VirtualSize : B0 26 01 ( 126B0)
디버거를 통해서 확인 한 섹션이 실제 메모리에 할당된 사이즈가 126B0이라는 뜻이다.
VirtualAddress : 00 10 ( 1000)
메모리 상에서 시작하는 주소이다. 보통 RVA라고 말한다.
이제 이 RVA를 이용해서 RAW와 함께 변환공식을 사용해서 각종 위치값들을 구할 수 있다.
추후에 data directiory에서 사용해보도록 하자.
SizeOfRawData : 00 28 01 (12800)
VirtualSize와 대비되는 녀석으로 파일 offset 상에서 나타나는 Section의 크기를 나타낸다.
VirtualSize 126B0과 크게 다르지 않은 값을 갖고 있다.
PointerToRawData : 00 04 (400)
파일 상에서 Section이 시작하는 offset 값을 나타낸다.
이 부분은 우리가 winhex를 통해서 바로 알 수 있다.
확인해보자.
400에서 첫번째 섹션이 시작되는 것을 확인 할 수 있었다.
이왕 조사하는거 크기도 맞는지 확인해보자.
12800 + 400 = 12C00
음.. 맞는 것 같다!
Charicteristics : 20 00 00 60 (60000020)
0110 0000 0000 0000 0000 0000 0010 0000
정의된 속성 값을 확인해보자.
//
// Section characteristics.
//
// IMAGE_SCN_TYPE_REG 0x00000000 // Reserved.
// IMAGE_SCN_TYPE_DSECT 0x00000001 // Reserved.
// IMAGE_SCN_TYPE_NOLOAD 0x00000002 // Reserved.
// IMAGE_SCN_TYPE_GROUP 0x00000004 // Reserved.
#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved.
// IMAGE_SCN_TYPE_COPY 0x00000010 // Reserved.
#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_LNK_OTHER 0x00000100 // Reserved.
#define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information.
// IMAGE_SCN_TYPE_OVER 0x00000400 // Reserved.
#define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image.
#define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat.
// 0x00002000 // Reserved.
// IMAGE_SCN_MEM_PROTECTED - Obsolete 0x00004000
#define IMAGE_SCN_NO_DEFER_SPEC_EXC 0x00004000 // Reset speculative exceptions handling bits in the TLB entries for this section.
#define IMAGE_SCN_GPREL 0x00008000 // Section content can be accessed relative to GP
#define IMAGE_SCN_MEM_FARDATA 0x00008000
// IMAGE_SCN_MEM_SYSHEAP - Obsolete 0x00010000
#define IMAGE_SCN_MEM_PURGEABLE 0x00020000
#define IMAGE_SCN_MEM_16BIT 0x00020000
#define IMAGE_SCN_MEM_LOCKED 0x00040000
#define IMAGE_SCN_MEM_PRELOAD 0x00080000
#define IMAGE_SCN_ALIGN_1BYTES 0x00100000 //
#define IMAGE_SCN_ALIGN_2BYTES 0x00200000 //
#define IMAGE_SCN_ALIGN_4BYTES 0x00300000 //
#define IMAGE_SCN_ALIGN_8BYTES 0x00400000 //
#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified.
#define IMAGE_SCN_ALIGN_32BYTES 0x00600000 //
#define IMAGE_SCN_ALIGN_64BYTES 0x00700000 //
#define IMAGE_SCN_ALIGN_128BYTES 0x00800000 //
#define IMAGE_SCN_ALIGN_256BYTES 0x00900000 //
#define IMAGE_SCN_ALIGN_512BYTES 0x00A00000 //
#define IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 //
#define IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 //
#define IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 //
#define IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 //
// Unused 0x00F00000
#define IMAGE_SCN_ALIGN_MASK 0x00F00000
#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.아뉘 뭐가 이리 많은거지#define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code.
#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable.
exe 파일이라는 것과 섹션에 코드가 포함되어 있다? 라는 의미 같다..............흑
이제 3개 중 1개가 끝났다. ㅎㅎ;;;
이제 다음 섹션 헤더를 살펴보자!
이제는 빠르게 확인만 하겠다.
두번째 SECTION HEADER
NAME[8] : 2E 64 61 74 61 (.data)
VirtualSize : 1C 10 (101C)
VirtualAddress : 00 40 01 ( 14000)
SizeOfRawData : 00 0A (A00)
PointerToRawData : 00 2C 01 (12C00)
아까 .text가 12C00에서 끝나는 걸 알아봤다.
저번 사진에서 보면 두번째 섹션이 12C00이다는 것을 확인했었다.
12C00 + A00 = 13600
정확히 두번째 섹션이 끝나고 세번째 섹션이 시작되는 것을 확인 할 수가 있었다.
Charicteristics : 40 00 00 C0 (C0000040)
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data.
#define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable.
#define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable.이 섹션에는 data가 담겨있고 읽을 수 있고 쓸 수 있다고 말하고 있다.
세번째 SECTION
NAME[8] : 2E 72 73 72 63 (.rsrc)
VirtualSize : 60 89 (8960)
VirtualAddress : 00 60 01 (16000)
SizeOfRawData : 00 8A (8A00)
PointerToRawData : 00 36 01 (13600)
두번째 섹션의 크기를 확인하면서 보았던 부분이다.
그럼으로 sizeofrawdata가 맞는지만 확인해보자.
1C000에 PE가 끝나는지 보면 될것이다.
사실 저번에도 확인했던 부분으로 긴말 없이 넘어가겠다.
Charicteristics : 40 00 00 40
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data.
#define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable.
이로써 calc.exe의 section header에 대해서 다 알아보았다.
다음은 아마 rva와 raw 계산식 관련 글이 될 것이다.
'Knowledge > Reversing' 카테고리의 다른 글
PE 구조 (8) - 계산기의 PE 구조 / IMAGE OPTIONAL HEADER - IMAGE DATA DIRECTORY 분석 (0) 2019.09.29 PE 구조 (7) RVA to RAW 변환 방법 (2) 2019.09.28 PE 구조 (5) - 계산기의 PE 구조 / NT HEADER - IMAGE OPTIONAL HEADER 분석 (0) 2019.09.25 PE 구조 (4) - 계산기의 PE 구조 / NT HEADER - IMAGE FILE HEADER 분석 (0) 2019.09.20 PE 구조 (3) - 계산기의 PE 구조 / PE offset 확인하는 법 (2) 2019.09.18