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)
섹션 이름을 포함하는 섹션 헤더 테이블 항목의 색인입니다..