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

+ Recent posts