NT header
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; //PE
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
Signature → 50450000
- FileHeader
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
주요 4가지
1. Machine: cpu 호환칩의 고유한 번호(값)를 저장
Machine값 → 14C (리틀엔디안방식) → 32비트 intel x86
2. NumberOfSections: 코드, 데이터, 리소스 등이 각 섹션에 나뉘어 저장되는데, 그 섹션의 개수를 나타냄 → 값이 반드시 0보다 커야하고, 실제 섹션의 개수와 다르면 에러가 발생
NumberOfSections값 → 0005(리틀엔디안방식) → 5개의 섹션
3. SizeOfOptionalHeader: IMAGE_OPTIONAL_HEADER32의 크기를 나타냄
SizeOfOptionalHeader의 값 → 00E0(리틀엔디안방식)
4. Characteristics: 파일의 속성 명시 (실행 가능한 형태, DLL 파일 등 의 정보를 저장) → bit OR 형식으로 조합으로 표기
Characteristics값 → 010E(리틀엔디안방식)
Characteristics값 → 18E8(리틀엔디안방식)
- Optional Header
typedef struct _IMAGE_OPTIONAL_HEADER {
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
주요 10가지
1. Magic: 32bit의 경우 10B, 64bit의 경우 20B
2. AddressOfEntryPoint: EP의 RVA값
3. ImageBase: PE 파일이 로드되는 시작 주소, EIP = ImageBase + AddressOfEntryPoint
4. SectionAlignment: 메모리에서 섹션의 최소 단위
5. FileAlignment: 파일에서 섹션의 최소 단위
6. SizeOfImage: 가상 메모리에서 PE Image가 차지하는 크기
7. SizeOfHeaders: PE header의 전체 크기
8. Subsystem: 실행 파일인지 구별 (.sys / .dll / .exe)
9. NumberOfRvaAndSizes: DataDirectory의 배열의 개수
10. DataDirectory: _IMAGE_OPTIONAL_HEADER 구조체의 배열
DataDirectory[0] = EXPORT Directory
DataDirecotry[1] = IMPORT Directory
DataDirectory[2] = RESOURCE Directory
DataDirectory[3] = EXCEPTION Directory
DataDirectory[4]= SECURITY Directory
DataDirectory[5] = BASERELOC Directory
DataDirectory[6] = DEBUG Directory
DataDirectory[7] = COPYRIGHT Directory
DataDirectory[8] = GLOBALPTR Directory
DataDirectory[9] = TLS Directory
DataDirectory[A] = LOAD_CONFIG Directory
DataDirectory[B] = BOUND_IMPORT Directory
DataDirectory[C] = IAT Directory
DataDirectory[D] = DELAY_IMPORT Direectory
DataDirectory[E] = COM_DESCRIPTOR Directory
DataDirectory[F] = Reserved Directory
CodeEngn
실행시키면 해당 창이 뜬다
아무 문자나 넣으면 not correct 창이 뜬다
- GetVolumeInformationA 함수 → 드라이브 정보를 검색
https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvolumeinformationa
- lstracat 함수 → 문자열 합치기
이름을 CodeEngn으로 변경해주면
GetVolumeInformationA 이후 40225C에 CodeEngn이 들어간 것을 볼 수 있고
4562-ABEX 와 합쳐진다
이후 연산을 통해 EqfgEngn4562-ABEX로 바뀌고
L2C-5781이 EqfgEngn4562-ABEX와 합쳐져 시리얼 넘버는 L2C-5781EqfgEngn4562-ABEX이 된다
구하는 값은 EqfgEngn
'동아리 > 팀 스터디' 카테고리의 다른 글
[9기 심화] 웹 취약점 분석 01 (0) | 2024.03.11 |
---|---|
[8기 기초] 리버싱 팀 06 (0) | 2023.11.10 |
[8기 기초] 리버싱 팀 04 (0) | 2023.10.14 |
[8기 기초] 리버싱 팀 03 (0) | 2023.10.11 |
[8기 기초] 리버싱 팀 02 (0) | 2023.09.29 |