본문 바로가기
ComputerScience/OS

LINUX, UNIX - ELF 파일 구조

by whitele 2022. 3. 30.
반응형

개요

유닉스(및 리눅스)의 표준 바이너리 파일 형식입니다. 실행, 목적 파일들 등을 위한 파일 형식입니다. 프로그래밍을 하고 소스코드가 기계어로 변환되는데 특정한 구조의 파일들이 존재합니다. 그중 하나가 ELF입니다. Windows에서는 PE로 정의된 파일을 사용합니다. ELF는 리눅스, 유닉스 운영체제 외에도 Android OS, PS Portable등에서 사용됩니다.

 
반응형

 

 

1.  ELF

Excuteable and Linkable Format의 약자입니다. 바이너리, 라이브러리, 코어 파일의 구조를 정의하는 파일 형식입니다. ELF에 대해 이해를 통해 운영체제에 대한 전반적인 이해와 개발, 보안(포렌식, 멜 웨어) 멜 웨어)에 대한 이점을 얻을 수 있습니다.

 

2.  ELF 구조

ELF의 기본구조는 헤더, 섹션 헤더, 프로그램 헤더 등으로 구분됩니다.

#define EI_NIDENT 16

typedef struct {
 	unsigned char e_ident[EI_NIDENT];
 	uint16_t      e_type;
	uint16_t      e_machine;
	uint32_t      e_version;
	ElfN_Addr     e_entry;
	ElfN_Off      e_phoff;
	ElfN_Off      e_shoff;
	uint32_t      e_flags;
	uint16_t      e_ehsize;
	uint16_t      e_phentsize;
	uint16_t      e_phnum;
	uint16_t      e_shentsize;
	uint16_t      e_shnum;
	uint16_t      e_shstrndx;
} ElfN_Ehdr;

2.1 ELF header

e_ident의 내용 중 일부입니다.

  • magic-파일의 시작은 ELF로 시작합니다. 매직 넘버 7F 45 4C 46으로 7F (E L F) 10 임을 나타냅니다
  • class – 32비트인지 64비트인지 구분하는 필드입니다.
  • data : 엔디안을 구분합니다. 바이트 순서의 차이입니다.
  • ABI – ABI버전을 옵션으로 지정할 수 있는 필드입니다. Application Binary Interface의 약자로 저수준 인터페이스를 지정합니다.

이후 다른 필드

  • version – 버전을 구분하지만 현재 크게 의미 있지는 않습니다.
  • machine – 기계 유형을 지정합니다. MIPS, AMD x86-64, IA64등이 있습니다.
  • type – 이 파일의 유형입니다. 코어 덤프, 실행, 라이브러리 등이 있습니다.

이후의 정보들은 주소, 프로그램 헤더 섹션 헤더 포인터 등이 있습니다.

 
 

2.2 프로그램 헤더

프로그램 헤더 테이블은 구조체의 배열로 되어 있으며 실행을 위해 시스템에게 준비를 요하는 정보나 세그먼트를 설명하는 부분입니다. 일반 바이너리일 경우 프로그램 헤더가 필요합니다.

 

 

typedef struct {
	uint32_t   p_type;
	Elf32_Off  p_offset;
	Elf32_Addr p_vaddr;
	Elf32_Addr p_paddr;
	uint32_t   p_filesz;
	uint32_t   p_memsz;
	uint32_t   p_flags;
	uint32_t   p_align;
} Elf32_Phdr;//32비트 기준

typedef struct {
	uint32_t   p_type;
	uint32_t   p_flags;
	Elf64_Off  p_offset;
	Elf64_Addr p_vaddr;
	Elf64_Addr p_paddr;
	uint64_t   p_filesz;
	uint64_t   p_memsz;
	uint64_t   p_align;
} Elf64_Phdr;//64비트 기준

 

 

2.3 섹션 헤더

연결 및 재배치에 사용되는 섹션을 정의하는 필드입니다. 파일의 모든 섹션을 정의합니다.

typedef struct {
	uint32_t   sh_name;
	uint32_t   sh_type;
	uint64_t   sh_flags;
	Elf64_Addr sh_addr;
	Elf64_Off  sh_offset;
	uint64_t   sh_size;
	uint32_t   sh_link;
	uint32_t   sh_info;
	uint64_t   sh_addralign;
	uint64_t   sh_entsize;
} Elf64_Shdr;//64비트 기준을 예시로 했으나 32비트와 차이는 없음

 

 

3. 마무리

elf 파일의 예를 보면 시작을 ELF로 되어 있는 것을 볼 수 있습니다.

elf file

인코딩이 ascii형식으로 되어 깨져 보입니다. 실제로는 hex dump 등이나 바이너리 분석 도구를 활용해야 합니다.

ELF 파일 형식은 실행 전용인 것만은 아닙니다. 객체 파일, 공유 라이브러리나 코어 덤프로 사용될 수 있습니다. Linux 커널 자체나 커널 모듈로도 사용됩니다. ELF는 매우 유연하여 확장성이 좋습니다.

 

 

참조

 

 

 

728x90
반응형

'ComputerScience > OS' 카테고리의 다른 글

Kali linux M1 apple silicon 칼리리눅스 m1 맥북 설치  (2) 2022.07.12
운영체제 인터럽트 처리  (0) 2022.04.25
Linux 파일 시스템 EXT  (0) 2022.03.08
운영체제 교착상태  (0) 2022.01.17
파일시스템의 할당 이론  (0) 2022.01.06

댓글