ELF 파일 

ELF ( executable and linking format) 은 실행 가능한 바이너리 또는 오브젝트 파일 형식을 규정한 것이다.
ELF 파일은 ELF 헤더가 맨 앞에 위치하고, 프로그램 헤더 테이블과 섹션 헤더 테이블이 뒤에 위치한다.
이 헤더의 구조는 elf.h 에 기술되어 있다.
X86 의 경우 /usr/include/elf.h 에 있고 다른 아키텍쳐의 경우도 대부분 기본 헤더 경로에 위치한다.
ELF 헤더는 ELF 파일 맨앞에 반드시 존재하며, 그 파일이 ELF 파일임을 나타낸다.
ELF 헤더 내용은 readelf 의 -h 옵션으로 알수 있다.
root@boggle70-desktop:~# readelf -h tmp/a.out 
ELF Header:
 Magic:   7f 45 4c 46 01 01 01 61 00 00 00 00 00 00 00 00 
 Class:                             ELF32
 Data:                              2's complement, little endian
 Version:                           1 (current)
 OS/ABI:                            ARM
 ABI Version:                       0
 Type:                              EXEC (Executable file)
 Machine:                           ARM
 Version:                           0x1
 Entry point address:               0x836c
 Start of program headers:          52 (bytes into file)
 Start of section headers:          5836 (bytes into file)
 Flags:                             0x2, has entry point, GNU EABI
 Size of this header:               52 (bytes)
 Size of program headers:           32 (bytes)
 Number of program headers:         6
 Size of section headers:           40 (bytes)
 Number of section headers:         34
 Section header string table index: 31

이런 형태로 표현되며 여러가지 정보를 얻을수 있다.
hexdump 로 이 파일을 한번 보겠습니다.
root@boggle70-desktop:~# hexdump tmp/a.out -n 128 -C
00000000  7f 45 4c 46 01 01 01 61  00 00 00 00 00 00 00 00  |.ELF...a........|
00000010  02 00 28 00 01 00 00 00  6c 83 00 00 34 00 00 00  |..(.....l...4...|
00000020  cc 16 00 00 02 00 00 00  34 00 20 00 06 00 28 00  |........4. ...(.|
00000030  22 00 1f 00 06 00 00 00  34 00 00 00 34 80 00 00  |".......4...4...|
00000040  34 80 00 00 c0 00 00 00  c0 00 00 00 05 00 00 00  |4...............|
00000050  04 00 00 00 03 00 00 00  f4 00 00 00 f4 80 00 00  |................|
00000060  f4 80 00 00 13 00 00 00  13 00 00 00 04 00 00 00  |................|
00000070  01 00 00 00 01 00 00 00  00 00 00 00 00 80 00 00  |................|
00000080

조금 분석하기 편한 형태로 표현 되었네요
처음 1byte 는 identify를 위한 것이고 그뒤 3byte 는 elf 라는 스트링으로 이 파일이 elf 포맷임을 나타냅니다.
그중에서 8번째 바이트가 OS type 을 나타냅니다.
17번째 byte를 보면 02 라는 값입니다.
이 정보는 object file type 을 나타내는데 위의 값은 Executable file 이라는 것을 나타냅니다.
elf.h 파일에는 아래와 같이 선언되어 있습니다.
159 /* Legal values for e_type (object file type).  */
160 
161 #define ET_NONE     0       /* No file type */
162 #define ET_REL      1       /* Relocatable file */
163 #define ET_EXEC     2       /* Executable file */
164 #define ET_DYN      3       /* Shared object file */
165 #define ET_CORE     4       /* Core file */
166 #define ET_NUM      5       /* Number of defined types */
167 #define ET_LOOS     0xfe00      /* OS-specific range start */
168 #define ET_HIOS     0xfeff      /* OS-specific range end */
169 #define ET_LOPROC   0xff00      /* Processor-specific range start */
170 #define ET_HIPROC   0xffff      /* Processor-specific range end */

기본적으로는 이 파일이 무슨 파일인지 확인하려면 file 명령으로 간단히 구분이 가능하지만
실행파일에 대한 더 자세한 정보를 보기를 원한다면 readelf 명령을 사용하는 것도 괜찮습니다.

<meta http-equiv="content-type" content="text/html; charset=utf-8">
참고 자료 : Binary Hacks - O'REILLY


</meta>