티스토리 뷰
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(가장 왼쪽에 있는 비트)가 가장 낮은 주소
[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 address가 0x4003b2라는 것인데, 이를 이용해 디스어셈블 시 첫 포인트를 잡을 수 있습니다.
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
'Security' 카테고리의 다른 글
Easy CrackMe 리버싱 (1) | 2019.05.08 |
---|---|
어셈블리로 구구단 짜기(nasm) (1) | 2019.04.02 |
RTL (Return to Libc) (0) | 2019.02.05 |
plt got (1) | 2019.02.03 |
리버싱 실습(Easy_ELF) (0) | 2019.01.24 |
- Total
- Today
- Yesterday
- Python Cookbook
- 김영환
- Thymeleaf
- 파이썬 for Beginner 연습문제
- Spring Data JPA
- 파이썬 for Beginner 솔루션
- 프로그래머스
- spring mvc
- 스프링 mvc
- 쉘 코드
- 지옥에서 온 git
- jsp
- git branch
- 쉽게 배우는 운영체제
- Spring
- JPA
- 스프링 컨테이너
- 방명록 프로젝트
- 선형 회귀
- git
- Do it! 정직하게 코딩하며 배우는 딥러닝 입문
- 스프링
- 생활코딩 javascript
- Computer_Networking_A_Top-Down_Approach
- 스프링 테스트
- Gradle
- Spring Boot
- git merge
- 운영체제 반효경
- 패킷 스위칭
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |