PE(Portable Excutable) 파일
PE 파일이란?
- Win32 기본 파일 형식
- exe, scr, sys, dll, ocx 등
- Process : EXE +DLL
- 실행 과정
- PE 파일 실행
- dll은 더블 클릭해도 실행되지 않음! dll은 exe가 call 해야 실행이 됨
- PE 헤더 정보를 메모리에 매핑
- 실제 프로세스를 위한 메모리 할당
- 섹션 정보를 메모리에 복사
- Import 정보 처리
- 기준 재배치 처리
- 실제 프로그램 코드로 분기
- https://learn.microsoft.com/ko-kr/windows/win32/debug/pe-format
- PE 파일 실행
notepad.exe(win7) 구조
- notepad.exe -> 보통 C:\Windows\System32에 있음
- PEview를 통해 notepad.exe의 구조를 분석할 거임
- 빨간 사각형으로 표시한 부분을 통해 PE 파일임을 알 수 있음
- PE 파일의 실행 영역은 .text 부분
- 실행 시 메모리의 특정 영역에 할당 등 동적인 행동을 하기 때문에 실행 후에 padding 영역이 증가
- file 상태로 있을 때는 내용이 차곡차곡 있는 게 좋음
- 그래야 사이즈도 크지 않고, 내용 정의도 쉽게 가능
- memory 상으로 올라가게 되면 추후 address를 매핑하게 되면서 각각의 주소에 접근
- text, data, rsrc 영역을 확인하면 address가 깔끔하게 떨어진 주소가 됨
- 이를 통해 조금 더 편리하게 매핑 가능
- text, data, rsrc 영역을 확인하면 address가 깔끔하게 떨어진 주소가 됨
- offset과 address의 차이: RVA, VA
- RVA(Relative Virtual Address)
- 가상 메모리 상대 주소
- PE 파일(DLL)이 메모리 상의 어떤 위치에 올라갈지 알 수 없음
- 기준점을 놓고 그 곳으로부터 위치를 계산함
- 기준점이 바뀌더라도 정보 접근이 가능하도록 함
- VA(Virtual Address)
- 가상 메모리 주소
- VA= ImageBase(대부분 40000000)+ RVA
- RVA(Relative Virtual Address)
notepad.exe(win7) 구조 - IMAGE_DOS_HEADER
- 5A4D, Signature
- 맨 처음엔 리틀 엔디안 표기법 사용으로 4D 5A로 표시
- 4D 5A를 아스키 코드로 읽으면 MZ
- MZ는 DOS의 SIGNATURE를 의미
- 보통 윈도우 시스템이라는 뜻
- 맨 처음엔 리틀 엔디안 표기법 사용으로 4D 5A로 표시
- 이외에도 IMAGE_DOS_HEADER에서 다양한 정보가 확인 가능
IMAGE_DOS_HEADER의 헤더 파일 - winnt.h
- 헤더 파일에 중요한 정보가 저장됨
- winnt.h: 윈도우 헤더
- e_magic
- 어떤 구조인지 알려주는 부분
- WORD로 두 칸이고, 4D 5A(MZ)는 PE 파일의 구조를 나타내는 시그니처
- 4D 5A(MZ) : PE 파일 구조
- D0 CF 11 E0(OLE), 50 4B(ZIP), 25 50 44 46(PDF),
- 89 50 4E 47(PNG)
- e_lfanew
- 실제 파일이 어디서 시작하는지 알려주는 부분
- 000000E8: IMAGE_NT_HEADER 시작 주소
- 중요! 헤더의 시작 주소
- PE 파일을 인증하는 두 가지 요소: 헤더가 MZ, 실제 e_lfanew가 PE
DOS Stub Code
- This program cannot be run in DOS mode
- 이 파일이 윈도우에서 실행되는 파일임을 알려줌
- 실행하지 않아도 정적 분석을 통해 윈도우에서 실행되는지 DOS에서 실행되는지 알 수 있음
NT_Header
- signature: 4byte 공간 PE 구조 파일 명시
- File_Header
- Machine(CPU): 0x8664 – AMD64 CPU 호환 (0x014c - IntelCPU)
- Number of Sections
- 섹션의 개수: 0x0006
- Time Data: 0x4A5BC9B3 → 1247529395
- /60=20792156분 35초, /60=346535시간 56분, /24=14438일 23시, /365=39년 203일
- 1970년 1월 1월 0시+39년 203일 23시 35초= 2009년 7월 13일 23시 56분 35초
- 파일 컴파일 일자를 의미함, 초만 계산 후 역산해서 연월일 출력
- Pointer To Symbol Table, Number of Symbols
- Size Of Optional Header: 0xE0(32bit), 0xF0(64bit), 0x00(obj)
- Characteristics: 파일 형식 정보, OR 연산
Optional_Header
- Magic
- 실행하는 PE 파일의 구조체가 32bit(0x10B)인지, 64bit(0x20B)인지 알려주는 부분
- Address of entry point
- 프로그램 시작되는 코드의 주소
- RVA 값으로 저장
- OllyDbg에서 처음 실행되는 주소 (악성코드 시작 지점으로 지정할 수 있음)
Section_Header
Section_Header의 종류
Section_Header의 주요 내용
'Study > 악성코드' 카테고리의 다른 글
[윈도우즈 보안과 악성코드 기초] PE 파일 헤더와 섹션 (0) | 2024.04.06 |
---|---|
[윈도우즈 보안과 악성코드 기초] 기초 정적 분석 (0) | 2024.04.06 |
[윈도우즈 보안과 악성코드 기초] 리버싱 이론 실습_crackme#1, #3 (0) | 2024.03.30 |
[윈도우즈 보안과 악성코드 기초] 문자열 패치 실습 (0) | 2024.03.23 |
[윈도우즈 보안과 악성코드 기초] 리버싱 이론 (리틀 엔디안 표기법, Register 이해, assembly 언어) (0) | 2024.03.23 |