STUDY

[3주차 TIL] KnockOn Bootcamp Pre.Rev : ELF 파일 구조

da1seun9 2024. 12. 22. 00:19

개요

리눅스 기반 OS의 기본 바이너리 파일은 ELF(Executable and Linkable Format) 형식이다.

ELF 파일이 어떻게 구성되어 있는지, 어떻게 매핑되고 실행될 수 있는지 알아보자

이 포스트는 검색과 실습으로 제작되었다.

구조

ELF 파일 구조는 ELF 헤더영역, ELF 프로그램 헤더 테이블, ELF 섹션 영역, ELF 섹션 헤더 테이블로 구성된다.

  • Segment : 동일한 메모리 속성(read-only, writeable 등)을 가진 하나 또는 그 이상의 섹션의 집합
  • Section : 특정 정보(machine instructions, symbol table 등)를 포함하고 있는 ELF file의 작은 조각
  • Symbol : ELF 파일 내 저장된 함수 또는 변수의 설명으로, 간단한 함수 또는 변수의 정보를 포함

image

ELF 파일 헤더 구조체 및 용도

  • 명령어 : readelf -h 또는 objdump -f
  • ELF 파일 헤더는 파일의 시작부분에 위치하며, 파일에 대한 전반적인 정보를 제공한다.
  • 파일의 구조를 정의하는 역할을 함

image

주요 구조체

  • e_ident(16byte): ELF 매직 넘버, 클래스(32비트/64비트), 엔디안 정보 등.
  • e_type(2byte): 파일 타입 (e.g., 실행 파일, 객체 파일, 공유 라이브러리).
  • e_machine(2byte): 실행 대상 아키텍처 (e.g., x86, ARM).
  • e_version(4byte): ELF 형식의 버전.
  • e_entry(8byte): 실행 시작 주소 (진입점).
  • e_phoff(8byte): 프로그램 헤더 테이블의 오프셋.
  • e_shoff(8byte): 섹션 헤더 테이블의 오프셋.
  • e_flags(4byte): 프로세서 관련 플래그.
  • e_ehsize(2byte): ELF 헤더의 크기.
  • e_phentsize(2byte): 프로그램 헤더 엔트리 크기.
  • e_phnum(2byte): 프로그램 헤더 엔트리 개수.
  • e_shentsize(2byte): 섹션 헤더 엔트리 크기.
  • e_shnum(2byte): 섹션 헤더 엔트리 개수.
  • e_shstrndx(2byte): 섹션 이름 문자열 테이블의 섹션 인덱스.

ELF 파일 프로그램 헤더 구조체 및 용도

  • 명령어 : readelf -l
  • 프로그램 헤더는 실행 시 ELF 파일이 메모리에 어떻게 매핑될지 정의한다.
  • 프로그램 헤더는 실행 시 운영체제가 메모리에 파일을 로드하는데 필요한 정보를 제공, 특히 실행파일이나 동적라이브러리의 세그먼트를 정의하며, 로더가 이 정보를 참조하여 ELF 파일을 실행 준비 상태로 만듦

image

주요 구조체

  • p_type: 세그먼트 타입 (e.g., PT_LOAD, PT_DYNAMIC).

  • p_offset: 파일 내 세그먼트 시작 위치.

  • p_vaddr: 세그먼트가 메모리에 매핑될 가상 주소.

  • p_paddr: 물리 주소 (일반적으로 무시됨).

  • p_filesz: 파일에서 세그먼트의 크기.

  • p_memsz: 메모리에서 세그먼트의 크기.

  • p_flags: 접근 권한 (읽기/쓰기/실행).

  • p_align: 메모리 정렬 요구 사항.

ELF 파일 섹션 헤더 구조체 및 용도

  • 명령어 : readelf -S 또는 objdump -h
  • ELF 파일 섹션 헤더는 각 섹션에 대한 메타데이터를 담고 있다.
  • ELF 파일을 구성하는 각 섹션에 대한 정보를 제공하며, 디버깅 심볼 ,문자열 테이블, 실행 코드 등 다양한 데이터를 구분하는데 사용

image

주요 구조체

  • sh_name: 섹션 이름의 오프셋.

  • sh_type: 섹션의 타입 (e.g., SHT_PROGBITS, SHT_SYMTAB).

  • sh_flags: 섹션의 속성 (읽기/쓰기/실행).

  • sh_addr: 섹션이 메모리에 로드되는 주소.

  • sh_offset: 파일 내에서 섹션 데이터가 시작되는 오프셋.

  • sh_size: 섹션의 크기.

  • sh_link: 섹션 간의 연관 정보를 나타냄.

  • sh_info: 추가 정보를 제공.

  • sh_addralign: 섹션의 정렬 요구 사항.

  • sh_entsize: 고정 크기 엔트리의 크기.

실습

<추가할 예정...>

꿀팁

  • xxd 명령어로 HxD처럼 파일을 16진수 변환해서 볼 수 있다.

  • objdump -d : disassemble

  • objdump -h : 섹션 헤더를 출력

  • objdump -f : 파일 헤더를 출력

  • objdump -x : 모든 헤더를 출력

  • objdump -s : 모든 콘텐츠 다 출력

  • objdump -S : disassemble 다 출력

끝.