티스토리 뷰

Security/보안 지식

ELF 파일 구조

on1ystar 2019. 5. 15. 21:55
728x90
반응형

ELF (Executable and Linkable Format)

유닉스 계열 시스템들의 표준 바이너리 파일로 실행 파일, 목적 파일. 공유 라이브러리 그리고 코어 덤프를 위한 표준 파일 형식

보통 ELF 파일은 ELF Header + program header table + section header table 로 구성됩니다.

 

 

ELF header : 파일의 구성을 나타내는 로드맵과 같은 역할

Section : Linking을 위한 object 파일의 정보를 다량으로 가지고 있으며, 명령, 데이터, 심볼 테이블, 재배치 정보 등이 담겨있습니다.

Program header table : 시스템에 프로세스 이미지를 어떻게 만들지 지시

프로세스의 이미지를 만들기 위해 사용되는 파일은 반드시 프로그램 헤더 테이블을 가져야 하며, 재배치 가능 파일의 경우에는 없어도 됩니다.

Section header table : 파일의 섹션들에 대해 알려줌

모든 섹션은 이 테이블에 하나의 entry를 가져야 함

각각의 엔트리는 섹션 이름이나 크기 같은 정보를 제공

만약 파일이 Linking하는 동안 사용되면, 반드시 섹션 헤더 테이블을 가져야 하며, 다른 object 파일은 가지고 있지 않을 수 있습니다. (옵션)

 

주로 먼저 찾아볼 곳이 ELF Header 부분이라고 생각해서 ELF Header 위주로 공부해 봤습니다. (사실 나머지 부분은 공부가 부족하네요…)

 

ELF Header

-      e_ident :  파일의 내용을 해석하고 디코딩하기 위해 필요한 정보들

배열의 INDEX 순서대로

[0 ~ 3 : File indentification]

ELF 파일임을 식별하기 위한 4바이트 매직 넘버로 7f 45(E) 4c(L) 46(F) 값이 들어갑니다.

[4 : Class]

파일의 클래스나 용량을 나타냅니다.

ELFCLASSNONE = 0 = Invalid class

ELFCLASS32 = 1 = 32-bit objects

ELFCLASS64 = 2 = 64-bit objects

[5 : Data encoding]

데이터의 인코딩 방식 정보

ELFDATANONE = 0 = Invalid data encoding

ELFDATA2LSB = 1 = LSB(가장 오른쪽에 있는 비트)가 가장 낮은 주소

ELFDATA2MSB = 2 = MSG(가장 왼쪽에 있는 비트)가 가장 낮은 주소

참고 https://m.blog.naver.com/PostView.nhn?blogId=tipsware&logNo=221242587827&proxyReferer=https%3A%2F%2Fwww.google.com%2F

[6 : File Version]

ELF header version number로 현재로서는 EV_CURRENT = 1이 사용됩니다.

[7 : Start of padding bytes]

[16 : Size of e_ident[]]

-      e_type : Object 파일의 타입

ET_NONE = 0 = No file type

ET_REL = 1 = Relocatable file

ET_EXEC = 2 = Executable file

ET_DYN = 3 = Shared object file

ET_CORE = 4 = Core file

ET_LOPROC = 0xff00 = Processor-specific

ET_HTPROC = 0xffff – Processor-specific

-      e_machine : architecture 정보

EM_NONE = 0 = No machine

EM_M32 = 1 = AT&TWE 32100

EM_SPARC = 2 = SPARC

EM_386 = 3 = Intel 80386

-      e_version : Object 파일의 버전 정보

EV_NONE = 0 = Invalid version

EV_CURRENT = 1 = Current version

-      e_entry : 시스템이 실행하기 위해 제어를 옮길 때 참조하는 가상 주소 (진입점) -> 프로그램의 시작 주소 (main)을 찾을 수 있습니다.

-      e_phoff : 프로그램 헤더 테이블의 파일 offset

-      e_flags : 파일과 관련해서 프로세서에 specific flag를 가짐

-      e_ehsize : ELF 헤더의 크기

-      e_phentsize : 프로그램 헤더 테이블에 있는 한 엔트리의 크기

-      e_phum : 프로그램 헤더 테이블에 있는 모든 엔트리의 수

e_phentsize * e_phum = 프로그램 헤더 테이블의 크기

-      e_shentsize : 섹션 헤더의 크기

-      e_shum : 섹션 헤더 테이블에 있는 엔트리 수

-      e_shstrndx : 섹션의 이름을 나타내는 스트링 테이블과 관련된 엔트리의 섹션 헤더 테이블 인덱스

-       

$ readelf 파일명 -> binary utililty로 해당 ELF 파일의 구조 정보를 보기 쉽게 나타냄

간단하게 매직 넘버와 아래의 정보들을 이용해 multi라는 object 파일은 ELF 64 파일이며 little endian 구조라는 점을 알 수 있는데, 이를 알면 디스어셈블을 할 때 저장된 바이트 정보를 읽는 방법이나 레지스터를 볼 때 참고할 수 있습니다.

또한 중요한 게 Entry point address0x4003b2라는 것인데, 이를 이용해 디스어셈블 시 첫 포인트를 잡을 수 있습니다.

 

Program Header

간단하게 위의 정보만 보면,

PHDR(value = 6) : 프로그램 헤더 테이블 자신의 위치와 크기 정보

INTERP(value = 3) : 인터프리터 호출을 위한 내용

LOAD(value = 1) : 로드 된 프로그램 세그먼트

DYNAMIC(value = 2) : 동적 링크 정보

<가로 행의 데이터 명 참고>

 

Section Header

이 역시 위의 나와있는 섹션 몇개의 정의만 간단하게 보겠습니다

Interp : interpreter의 경로 명을 가지는 섹션

Hash : symbol hash table을 가지는 섹션

Dynamic : 동적 linking 정보를 가지는 섹션

Dynstr : 동적 linking을 위해 필요한 스트링들

Plt : procedure(함수)의 링크 테이블

Got.plt : global offset table을 가지는 섹션

Text : 프로그램의 실행 가능한 명령어 정보

Data : 초기화된 데이터를 가지는 섹션

Bss : 초기화 되지 않은 데이터를 가지는 섹션

Shstrtab : 섹션들의 이름들을 가지는 섹션

Symtab : 심볼 테이블을 정보

Strtab : 스트링 테이블을 정보

<가로 행의 데이터 명 참고>

 

Symbol table

$ readelf -s 파일명

이런 명령어를 치면 symbol table 저장되어 있는, 사용한 함수나 변수들을 보여주는데, 디스어셈블을 하기 전에 참고해보면 좋을 거 같기도 하네요.

 

참조 : http://www.cs.cmu.edu/afs/cs/academic/class/15213-s01/s00/doc/elf.pdf

         https://pu1et-panggg.tistory.com/32

728x90
반응형

'Security > 보안 지식' 카테고리의 다른 글

plt got  (1) 2019.02.03
취약점(vulnerability)  (0) 2019.01.20
댓글