Upload
ilsun-choi
View
23
Download
4
Embed Size (px)
Citation preview
Index
1. PE 구조를 알아야 할 필요성
2. PE에 대한 상식적인 개념
3. 빌드 과정
4. PE 파일 구조
5. IMAGE_DOS_HEADER
6. IMAGE_NT_HEADER
•1) Signature
•2) 구조체 구성
•3) IMAGE_FILE_HEADER
•4) IMAGE_OPTIONAL_HEADER
7. IMAGE_SECTION_HEADER
8. PE와 API 호출의 원리
9. IAT에서 API를 계산하는 방법
참고문헌
E-mail : [email protected] Writing by Ilsun Choi 2
1. PE 구조를 알아야 할 필요성
프로세스 적재
를 위한 정보
API 호출을
위한 IAT
코드 사이즈와
각 섹션의 위치
언패킹
바이러스 분석
안티 디버깅
E-mail : [email protected] Writing by Ilsun Choi 3
2. PE에 대한 상식적인 개념
Portable Executable File Format
파일(File)이
+ 이식 가능한 다른 곳에 옮겨져도 (Portable)
+ 실행 가능하도록 (Executable)
+ 만든 포맷(Format)
E-mail : [email protected] Writing by Ilsun Choi 4
3. 빌드 과정
E-mail : [email protected] Writing by Ilsun Choi 5
#include <window.h>void main()
0x18, 0x19, 0x01, 0x02, 0x03
Static Link Library
Import Library
PE Header
0x18, 0x19, 0x01, 0x02, 0x03
Footer
Source.h Source.obj
Binary.exe
compile
Link
모든 헤더파일과 소스파일을 합쳐 하나의기계어 코드 생성
DLL, 리소스 데이터, Import, Export 테이블을 처리할 수 있는정보를 윈도우에 약속된 규약에 맞춰 기입
실행파일 로딩 시 PE Header 정보를 토대로 DLL을 로드, 메모리에 적재될 각종 리
소스 할당(PE 헤더 정보 오류시 로딩 불가)
4. PE 파일 구조
이와 관련된 공부를 하면 자연스럽게 익히게 됨
PE 구조체
E-mail : [email protected] Writing by Ilsun Choi 6
IMAGE_DOS_HEADERIMAGE_NT_HEADERIMAGE_FILE_HEADERIMAGE_OPTIONAL_HEADERIMAGE_SECTION_HEADERIMAGE_IMPORT_DESCRIPTORIMAGE_EXPORT_DIRECTORYIMAGE_IMPORT_BY_NAMEIMAGE_THUNK_DATA32
5. IMAGE_DOS_HEADER
E-mail : [email protected] Writing by Ilsun Choi 7
PE 가장 첫 번째 값으로MZ(마크 즈비코프스키가 개발) 헤더를 통해
MS-DOS 헤더의 시작을 알림(이 바이너리가 PE 파일인지 검사)
IMAGE_NT_HEADER의구조체 위치를 알림
6. IMAGE_NT_HEADER > 1) Signature
E-mail : [email protected] Writing by Ilsun Choi 8
Signature : “PE\0\0” : 4바이트바이러스에 자신의 시그니쳐를 심기도 함바이러스나 악성코드 감염 표식용으로 사용
6. IMAGE_NT_HEADER > 2) 구조체 구성
E-mail : [email protected] Writing by Ilsun Choi 9
6. IMAGE_FILE_HEADER > 3) IMAGE_FILE_HEADER[1/2]
E-mail : [email protected] Writing by Ilsun Choi 10
어떤 CPU에서 실행 가능한지 알림(일반 Desktop, Labtop에서 사용할 경우, 별로
필요 없음)
이 파일이 가진 세션의 개수를 알림(일반적으로 .text, .rdata, .data, .rsrc
4개 섹션이 존재)
obj EXE 파일을 만든 시간을 알림(델파이로 만들어진 파일은 항상 1992년으로
표시됨)
6. IMAGE_FILE_HEADER > 3) IMAGE_FIEL_HEADER[2/2]
E-mail : [email protected] Writing by Ilsun Choi 11
IMAGE_OPTIONAL_HEADER32의구조체 크기를 알림
(PE를 로딩하기 위한 굉장히 중요한 구조체를담고 있음, 운영체제마다 크기가 다를 수 있어
PE 로더에서는 이 값을 먼저 확인)
이 파일이 어떤 형식인지 알림
Characteristics num Characteristics num
IMAGE_FILE_RELOCS_STRIPPED 0x0001 IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020
IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 IMAGE_FILE_BYTES_REVERSED_LO 0x0080
IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 IMAGE_FILE_32BIT_MACHINE 0x0100
IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 IMAGE_FILE_DEBUG_STRIPPED 0x0200
IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010 IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400
#define Characteristics
6. IMAGE_FILE_HEADER > 4) IMAGE_OPTIONAL_HEADER [1/3]
E-mail : [email protected] Writing by Ilsun Choi 12
32bit 0x10B64bit 0x20b
코드 양의 전체 크기악성코드 : 이 값을 참고하여 자신의코드를 복제할 위치 기준을 잡음
보안 솔루션 : 코드 섹션의 무결성 검사
Standard Fields
사용한 컴파일러 버전
파일이 메모리에서 실행되는 시작 지점
실행 코드 위치(ImageBase와 BaseofCode를더한 값부터 코드 시작)
6. IMAGE_FILE_HEADER > 4) IMAGE_OPTIONAL_HEADER [2/3]
E-mail : [email protected] Writing by Ilsun Choi 13
로드할 가상 메모리 주소
각 세션을 정렬하기 위한 정렬 단위(보통 0x1000)
NT additional feilds
EXE/DLL이 메모리에 로딩되었을 때전체 크기
PE 헤더의 크기를 알려줌( 기본값 0x1000 )
구조체: VirtualAddress와 Size 필드(Export, Import, Rsrc 디렉터리와 IAT 등의 가상
주소와 크기 정보)
6. IMAGE_FILE_HEADER > 4) IMAGE_OPTIONAL_HEADER [3/3]
E-mail : [email protected] Writing by Ilsun Choi 14
RVA (Relative Virtual Address) : 상대주소
NT Header -> Data Directory
IAT 시작 주소IMAGEBASE(0x01000000) + RVA(0x7604)
= 0x1007604
7. IMAGE_SECTION_HEADER
주로 각 섹션에 대한 이름, 시작 주소, 사이즈 등의 정보를 관리하는 구조체
E-mail : [email protected] Writing by Ilsun Choi 15
MEM_READ, MEM_EXECUTE, MEM_WRITE는 각 세션의 RWE 속성을 나타냄
8. PE와 API 호출의 원리
E-mail : [email protected] Writing by Ilsun Choi 16
IAT에는 해당 함수의실제 주소가 들어있다.
IAT 주소에 쓰인 값을참조한다.
실제주소를 참고하여CALL하는 위치이다.
msvcrt.__set_app_type 함수 호출 과정
9. IAT에서 API를 계산하는 방법
[Stud_PE] – [Functions] – [ADVAPI32.dll] – [MORE]
E-mail : [email protected] Writing by Ilsun Choi 17
9. IAT에서 API를 계산하는 방법
[Stud_PE] – [Functions] – [ADVAPI32.dll] – [RegQueryValueExW]
E-mail : [email protected] Writing by Ilsun Choi 18
IMAGE_IMPORT_BY_NAME
0x00007CA2
9. IAT에서 API를 계산하는 방법
IAT 호출 과정
E-mail : [email protected] Writing by Ilsun Choi 19
IMAGE_THUNK_DATA32
0x000076CC
IMAGE_IMPORT_DESCRIPTION
Name : ADVAPI32.dll
이와 관련된 자세한 사항을 보려면 코드를 직접 분석 해보면 된다. http://blog.naver.com/isc0304/220388240818Export Table은 IAT와 유사하여 IAT를 익히면 자연히 알 수 있다.