저번 PE 구조 분석에 이어서 이번에는 Section header와 Section에 대해서 분석을 해보겠습니다.
1) Section header
이부분이 바로 Section header부분입니다.
Section header 구조체가 하는 일은 각 Section을 분리시키고, Section들의 속성, 크기, 시작 위치 등 등을 정하는 곳입니다.
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 |