반응형
ELF는 Linux 및 유닉스 계열 시스템에서 실행파일, 오브젝트 파일, 공유 라이브러리, 커널 모듈에 이르기까지 널리 사용되는 표준 이진 포맷입니다.
리버서에게 있어 ELF 구조를 정확히 이해하는 것은 바이너리 해석, 후킹, 섹션 주입, Exploit 개발의 기초가 된다.
📘ELF 구조 분석 – 리눅스 실행파일을 해부하다
🔍 5.1 ELF란?
ELF(Executable and Linkable Format)는 리눅스/유닉스 계열 운영체제에서 사용되는 실행파일 및 링크 가능 오브젝트 포맷이다.
기본적인 목적은 OS가 파일을 쉽게 읽고 메모리에 적절히 맵핑하여 실행하거나 재사용할 수 있도록 설계된 구조다.
ELF는 Windows의 PE(Portable Executable)와 같은 역할을 하며, 리버싱 시 PE와 함께 반드시 숙지해야 할 포맷이다.
📦 5.2 ELF 전체 구조 개요
+-------------------------+
| ELF Header | ← 파일 시작
+-------------------------+
| Program Header Table | ← 실행 시 메모리 맵 정보
+-------------------------+
| Section Header Table | ← 컴파일러/링커용 정보
+-------------------------+
| Sections (.text, .data, .rodata, ...) |
+-------------------------+
🔍 5.3 ELF Header – 파일의 메타 정보
✔ 구조
typedef struct {
unsigned char e_ident[16]; // ELF magic number & type info
uint16_t e_type; // 파일 타입 (exec, reloc, dyn 등)
uint16_t e_machine; // 타겟 아키텍처 (x86, ARM 등)
uint32_t e_version; // ELF 버전
uint64_t e_entry; // 진입점 주소 (Entry Point)
uint64_t e_phoff; // Program Header Table 오프셋
uint64_t e_shoff; // Section Header Table 오프셋
...
} Elf64_Ehdr;
✔ 분석 명령어
readelf -h target.elf
🧠 리버싱 포인트
필드 | 의미 |
e_entry | 디버깅/디스어셈 시작 주소 |
e_phoff | 실행 시 메모리 매핑용 정보 위치 |
e_shoff | 분석용 섹션 정보 (디버깅, 심볼 확인 등) |
🧱 5.4 Section Header Table – 분석용 정보
✔ 구조
typedef struct {
uint32_t sh_name; // 섹션 이름 (문자열 테이블 인덱스)
uint32_t sh_type; // 섹션 타입 (PROGBITS, SYMTAB 등)
uint64_t sh_flags; // 권한 (RWX)
uint64_t sh_addr; // 메모리 상 주소
uint64_t sh_offset; // 파일 내 오프셋
uint64_t sh_size; // 섹션 크기
...
} Elf64_Shdr;
✔ 분석 명령어
readelf -S target.elf
✔ 대표 섹션
섹션 | 설명 |
.text | 실행 코드 |
.data | 초기화된 전역 변수 |
.bss | 초기화되지 않은 전역 변수 |
.rodata | 상수, 문자열 |
.symtab, .strtab | 심볼 테이블 |
.plt, .got | 동적 링킹용 주소 테이블 |
📌 이 영역은 디버깅, 섹션 주입, 바이너리 패치의 주요 대상이다.
🔥 5.5 Program Header Table – 실행 시 메모리 매핑 정보
✔ 구조
typedef struct {
uint32_t p_type; // 세그먼트 타입 (LOAD, DYNAMIC 등)
uint32_t p_flags; // 권한 (RWX)
uint64_t p_offset; // 파일 내 오프셋
uint64_t p_vaddr; // 가상 메모리 주소
uint64_t p_filesz; // 파일 상 크기
uint64_t p_memsz; // 메모리 상 크기
...
} Elf64_Phdr;
✔ 분석 명령어
readelf -l target.elf
🧠 역할
- OS의 로더(Loader) 가 참조하는 정보
- 각 LOAD 세그먼트를 메모리에 매핑할 때 사용
📌 p_vaddr와 p_offset 관계를 이용해 파일 → 메모리 주소 매핑 계산 가능
📌 ROP gadget, shellcode 삽입 시 이 테이블을 기반으로 공격 주소 설정
🔍 5.6 실행 흐름 요약
1. 실행 요청 → OS 커널 호출
2. 커널은 ELF Header → e_phoff로 Program Header Table 접근
3. 필요한 Segment들을 메모리에 로드 (p_offset → p_vaddr)
4. e_entry 주소로 점프하여 코드 실행 시작
🔧 리버싱 실습 예제
readelf -h a.out # ELF 헤더 확인
readelf -l a.out # Program Header Table (메모리 매핑용)
readelf -S a.out # Section Header Table (분석용)
objdump -d a.out # 어셈블리 디스어셈블
xxd -s 0x8048000 a.out # 파일 오프셋 → 주소 확인
✅ 정리
영역 | 용도 | 리버싱 포인트 |
ELF Header | 파일 전체 메타 정보 | Entry Point, PH/SH 오프셋 |
Section Header | 분석/링커용 | .text, .data, 심볼, 패치 대상 |
Program Header | 메모리 매핑 | 실행 시 주소 계산, shellcode 삽입용 |
📌 실전 과제
- readelf -hS -l로 ELF 파일 구조 확인
- .text 섹션 오프셋과 실행 주소 비교
- objdump -d에서 main 함수가 실제 어떤 주소에 위치하는지 추적
- Ghidra에서 ELF 파일을 열어 .got, .plt 분석 실습
반응형
'게임해킹 > knockon 부트캠프' 카테고리의 다른 글
[3주차 TIL] KnockOn Bootcamp - 메모리 구조와 매핑 (0) | 2025.04.22 |
---|---|
[3주차 TIL] KnockOn Bootcamp - 링커와 로더 (0) | 2025.04.22 |
[3주차 TIL] KnockOn Bootcamp - 컴파일러 (0) | 2025.04.22 |
[3주차 TIL] KnockOn Bootcamp - 아키텍쳐 (2) | 2025.04.22 |
[2,3주차 TIL] KnockOn Bootcamp - 프로젝트 만들기 (0) | 2025.04.15 |