ELF(Executeable and Linkable Format)

리눅스/유닉스 계열에서의 실행파일의 포맷입니다.

 

파일 형식

1) ET_NONE (ELF type none) (0x 0000)

: 알 수 없는 형식 -> 아직 정의되지 않았거나 알 수 없다는 의미

 

2) ET_REL (ELF type relocatable) (0x 0001) - 링킹 가능한 포맷

: 재배열이 가능한 파일 형식 -> 아직 실행파일에 링킹되지 않은 상태

  (*.o 파일로 컴파일만 진행된 상태)

 - relocatable symbol들을 symbol resolving reference 해야하는 바이너리

 

3) ET_EXEC (ELF type executable) (0x0002) - 실행 가능한 포맷

: 실행 파일 형식(= 프로그램) -> 프로세스의 시작 지점인 엔트리 포인트가 존재

 - relocatable symbol들을 모두 symbol resolving reference 해서 실행 가능한 바이너리

 

4) ET_DYN (ELF type dynamic) (0x0003) - 실행 가능하면서 링킹 가능한 포맷

: 공유 오브젝트 파일 형식 -> 동적 링킹이 가능한 오브젝트 파일 (= 공유 라이브러리)

 (런타임 중에 프로그램의 프로세스 이미지로 로드되고 링크 됨)

 - relocatable symbol들을 symbol resolving reference 해서 실행 가능하지만, 공유 혹은 동적 라이브러리를 실행 시에 혹은 런타임에 링킹시켜야 하는 바이너리

 

5) ET_CORE (ELF type core) (0x0004)

: 코어 파일 형식 -> 프로세스 이미지의 전체 덤프

  주로 프로그램이 비정상 종료되거나 SIGSEGV 시그널(세그멘테이션 폴트)로 인해 프로세스가 종료된 경우 생성

  GDB로 코어파일을 읽어 분석해 비정상 종료된 시점의 원인 분석이 가능

 

ELF는 Linking View 와 Execution View 라는 두가지 형태가 있습니다.

Linking View가 relocatable file의 형식이다.

Link가 끝난 후에 완전히 실행 가능한 형태가 된 ELF 형식을 Execution View라고 한다.

매직넘버(0x00~0x4)

0x7F, 'E', 'L', 'F' (아스키 코드)

 

매직넘버는 파일 형식을 식별하는데 사용되는 값입니다.

예로 PNG의 경우 89 50 4E 47(.PNG) 을 매직넘버로 사용합니다.

 

https://asecuritysite.com/forensics/magic

매직넘버는 이러한 사이트에서 확인해볼 수 있습니다.

 

32, 64비트 구분(0x04~0x05)

값이 1이면 32비트, 2이면 64비트입니다.

 

엔디안 구분(0x05~0x06)

값이 1이면 리틀엔디안, 2이면 빅엔디안입니다.

 

ELF 버전(0x06~0x07)

ELF 파일 버전인데 대부분 1입니다.

 

OS ABI 종류(0x07~0x08)

Value ABI
0x00 System V
0x01 HP-UX
0x02 NetBSD
0x03 Linux
0x04 GNU Hurd
0x06 Solaris
0x07 AIX
0x08 IRIX
0x09 FreeBSD
0x0A Tru64
0x0B Novell Modesto
0x0C OpenBSD
0x0D OpenVMS
0x0E NonStop Kernel
0x0F AROS
0x10 Fenix OS
0x11 CloudABI
0x12 Stratus Technologies OpenVOS

OS ABI 버전(0x08~0x09)

ABI 버전을 추가로 지정합니다.

해석은 ABI에 따라 달라집니다.

 

PAD(0x09~0x10)[7byte]

사용되지 않습니다. 0으로 채워져야 합니다.

 

파일 형식(0x10~0x12)

 

Value Type
0x00 ET_NONE
0x01 ET_REL
0x02 ET_EXEC
0x03 ET_DYN
0x04 ET_CORE
0xFE00 ET_LOOS
0xFEFF ET_HIOS
0xFF00 ET_LOPROC
0xFFFF ET_HIPROC

위에 서술한 파일 형식입니다.

 

ISA(0x12~0x14)

대상 ISA를 지정합니다.

 

ELF 버전(0x14~0x18)

위에 ELF 버전과 같습니다.

 

진입점(0x18 ~ 0x1C or 0x20)

프로그램을 시작하는 진입점의 메모리 주소입니다.

위에 써진 비트에 따라서 4바이트 또는 8바이트의 길이를 갖습니다.

 

e_phoff (0x1C~0x20|0x20~0x28)

프로그램 헤더 테이블의 시작을 가리 킵니다

 

e_shoff (0x20~0x24|0x28~0x30)

섹션 헤더 테이블의 시작을 가리 킵니다

 

e_flags (0x24~0x28|0x30~0x34)

대상 아키텍처에 따라 필드의 해석이 다릅니다.

 

e_ehsize (0x28~0x2A|0x34~0x36)

이 헤더의 크기입니다. (일반적으로 64 비트의 경우 64 바이트, 32 비트 형식의 경우 52 바이트)

 

e_phentsize (0x2A~0x2C|0x36~0x38)

프로그램 헤더 테이블 항목의 크기입니다.

 

e_phnum (0x2C~0x2E|0x38~0x3A)

프로그램 헤더 테이블의 항목 수입니다.

 

e_shentsize(0x2E~0x30|0x3A~0x3C)

섹션 헤더 테이블 항목의 크기입니다.

e_shnum(0x30~0x32|0x3C~0x3E)

섹션 헤더 테이블의 항목 수입니다.

e_shstrndx(0x32~0x34|0x3E~0x40)

섹션 이름을 포함하는 섹션 헤더 테이블 항목의 색인입니다..

헤더의 끝(0x34|0x40)

728x90

+ Recent posts