강좌 & 팁
글 수 2,412
2011.02.26 20:02:31 (*.138.143.120)
51670
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">
</meta>
참고 자료 : Binary Hacks - O'REILLY