728x90
Mach-O(Mach Object) 파일 포맷은 macOS, iOS 등 Apple 운영체제에서 사용되는 실행 파일, 라이브러리(.dylib), 커널 모듈 등 바이너리의 파일 포맷입니다. ELF(Linux)나 PE(Windows)와 같은 목적을 가지며, 모듈화된 구조와 다양한 아키텍처 지원을 위해 설계되었습니다.
Mach-O 파일의 기본 구조
+----------------------+
| Mach Header | ← 파일 시작
+----------------------+
| Load Commands |
+----------------------+
| Segment & Section | ← 실제 바이너리 코드 및 데이터
| (__TEXT, __DATA 등)|
+----------------------+
| Symbol Table (선택) |
+----------------------+
| String Table (선택) |
+----------------------+
1. Mach Header
파일의 기본 정보를 담고 있습니다. 예:
- CPU 아키텍처 (x86_64, arm64 등)
- 파일 타입 (실행파일, dylib, bundle 등)
- load command 개수
- 32bit / 64bit 여부
struct mach_header_64 {
uint32_t magic; // 0xFEEDFACF (64비트), 0xFEEDFACE (32비트)
cpu_type_t cputype;
cpu_subtype_t cpusubtype;
uint32_t filetype;
uint32_t ncmds;
uint32_t sizeofcmds;
uint32_t flags;
uint32_t reserved; // only for 64-bit
};
2. Load Commands
Mach-O의 중앙 디렉터리 같은 개념입니다. 파일 안에 있는 세그먼트 정보, 심볼, 동적 라이브러리, Entry point 등 메타데이터를 정의합니다.
Load Command는 LC_*로 시작하는 다양한 타입이 있습니다.
예시:
- LC_SEGMENT_64: 세그먼트를 정의함
- LC_SYMTAB: 심볼 테이블 정보
- LC_LOAD_DYLIB: 외부 .dylib 로딩 정보
- LC_MAIN: main entry point (iOS/macOS에서)
3. Segment & Section
세그먼트(Segment)는 메모리에 매핑되는 논리적 블록이고, 섹션(Section)은 세그먼트 내에 존재하는 세부 블록입니다.
주요 세그먼트
| 세그먼트 | 설명 |
| __TEXT | 실행 코드, 상수, 문자열 |
| __DATA | 초기화된 전역 변수, HMAC 저장 가능 |
| __LINKEDIT | 심볼, 디버깅 정보 등 |
| __PAGEZERO | NULL 포인터 방지용 (읽기/쓰기 불가 메모리) |
주요 섹션
각 세그먼트는 여러 섹션을 포함합니다.
세그먼트섹션 이름설명
| 세그먼트 | 섹션 | 설명 |
| __TEXT | __text | 실제 코드 |
| __TEXT | __cstring | 문자열 상수 |
| __DATA | __data | 초기화된 데이터 |
| __DATA | __bss | 초기화되지 않은 데이터 (런타임에 0으로 초기화됨) |
4. Symbol Table (옵션)
심볼 테이블은 함수명, 전역변수명 등 심볼의 이름과 주소를 연결합니다. nm, objdump 같은 도구로 분석 가능.
5. String Table (옵션)
심볼의 이름 등 문자열 정보가 여기에 저장됩니다.
mach-o 파일 구조 분석 도구 otool
otool은 macOS에서 Mach-O 파일을 분석하는 명령어입니다.
리눅스의 objdump, readelf, nm과 유사하게, 바이너리의 구조, 섹션, 심볼, 라이브러리 종속성 등을 확인할 수 있습니다.
$otool -l mylib.dylib
출력 예시:
Load command 0
cmd LC_SEGMENT_64
cmdsize 712
segname __TEXT
vmaddr 0x0000000100000000
...
Section
sectname __text
segname __TEXT
addr 0x100000f60
size 0x0000001c0
| 옵션 | 설명 |
| -h | Mach-O 헤더 출력 |
| -l | Load Commands 출력 |
| -L | 연결된 외부 .dylib 목록 (LC_LOAD_DYLIB) |
| -t | __TEXT, __text 섹션의 기계어 출력 (디스어셈블링 없이) |
| -v | 기계어를 가독성 있게 출력 |
| -V | 기계어를 AT&T 어셈블리로 디스어셈블 |
| -s <segment> <section> | 특정 세그먼트/섹션의 헥사 값 출력 |
| -S | 모든 섹션의 내용을 출력 |
| -r | 재배치 정보 (relocation entries) 출력 |
| -M | Objective-C 메서드 목록 출력 |
| -I | indirect symbol table 출력 |
| -dyld_info | dyld 정보 출력 (lazy symbol, bindings 등) |
728x90
'Programming > IOS, macOS, Android' 카테고리의 다른 글
| Apple 코드사인(CodeSign) 개념 (0) | 2025.04.24 |
|---|