반응형

👋 들어가기 전
랭그래프 포스팅 이후, 약 3개월만의 포스팅이다..
회사와 사이드에 치이다보니, 학습시간이 많이 없어 포스팅을 할께 없었다.
이번 포스팅은 최근 회사에서 바이너리를 분석하는 경험을 하게되었는데, 그 때 알게된 지식과 유용한 tool 사용버을 기록하고자한다.
🏁 학습할 내용
- nm
- otool
✊ nm
유닉스 계열 운영체제의 object, 실행, 라이브러리등
파일내에 포함된 심볼을 확인하는 도구
🚀 역할
- 컴파일/링크 오류 디버깅
- 라이브러리 분석
- 바이너리 분석
💬 명령어
nm -[옵션 나열..] [파일]
| 옵션 | 설명 |
| -n (numeric-sort) | 주소 순서대로 정렬 |
| -u (undefined-only) | 정의도지 않은 심볼만 |
| -C (Demangle) | Mangling 심볼을 다시 사람이 읽기 쉬운 형태로 변환 |
| -D (dyamic) | 동적 심볼로 표시 (공유 라이브러리 분석 시 유용) |
| -p (no-sort) | 정렬하지 않고 파일 순서대로 출력 |
| --define-only | 정의된 심볼만 출력 (정적 라이브러리 내 제공 심볼 확인) |
| -S | 크기 및 끝 주소 필드 추가 |
| --size-sort | 크기 내람차순 정렬 |
🧐 분석
먼저 출력 결과는 다음과 같이 구성되어있다.
[주소] [심볼 타입] [심볼 이름]
🔑 심볼 타입
대문자는 외부공개(전역), 소문자는 내부용
| T/t | 코드 섹션에 있는 심볼로, 보통 함수를 의미 |
| D/d | Data영역, 초기화된 전역 변수나 정적 변수가 위치하는 섹션 |
| B/b | BSS영역, 초기화되지 않은 전역 변수가 위치하는 섹션 |
| S/s | data section, (small 포함, ObjC metadata 포함 가능) |
| U | 해당 파일 내에 정의되어 있지 않고, 외부에서 가져와야 하는 심볼 |
| R/r | 읽기 전용 |
| W/ V | 약(weak) 심볼, 링커가 중복 시 강 심볼로 대체 |
| C | 공용(Common)심볼 |
간단한 예제와 실제결과물과 함께 분석을해보자.
objc코드냐, swift코드냐에 따라 조금 포맷이 갈린다.
- Objc: OBJC로 시작
- Swift: $s로 시작: mangled symbol
// OBJC
0000000002ec8e88 S _OBJC_CLASS_$_WXWebViewController
// Swift
000000000175b260 s _$s12FirebaseAuth19ActionCodeOperationOMB
000000000031d1dc T _$s12FirebaseAuth19ActionCodeOperationOMa
00000000017dfb20 s _$s12FirebaseAuth19ActionCodeOperationOMf
00000000016a3354 S _$s12FirebaseAuth19ActionCodeOperationOMn
00000000017dfb30 S _$s12FirebaseAuth19ActionCodeOperationON
00000000014cc838 S _$s12FirebaseAuth19ActionCodeOperationOSHAAMc
0000000001a1ff00 b _$s12FirebaseAuth19ActionCodeOperationOSHAAMcMK
000000000031d160 t _$s12FirebaseAuth19ActionCodeOperationOSHAASH13_rawHashValue4seedS2i_tFTW
여기서 swift와 Objc는
- _ $s → Swift symbol
- s, t, T -> 심볼 타입
- 12FirebaseAuth: 모듈명길이 + 모듈명
- 19ActionCodeOpetion: 타입명길이 + 타입명
- Suffx: 런타임 메타데이터, 최종 어떤 구조인지 추측할 수 있는 정보
☝️otool
Mach-O 해부기
🚀 역할
- Mach-O 내부 구조를 분석
- @rpath
- linking 분석
- 중복 framework 분석
💬 명령어
ottol -[옵션] [Mach-O 바이너리]
| 옵션 | 설명 |
| -L | 의존하는 dynamic library 조회 |
| -l | Load Commands |
| -h | Mach header 분석 |
😀 소감 및 마무리
| 목적 | nm | tool |
| 함수 심볼 보기 | O | △ |
| undefined symbol 확인 | O | O |
| dylib dependency | X | O |
| rpath 확인 | X | O |
| Mach-O 구조 | X | O |
| dynamic/static 판단 | △ | O |
| disassemble | △ | O |
출처
https://jinolab.tistory.com/254
nm 도구로 ELF/오브젝트 심볼 한눈에 파악하기
nm(GNU binutils 패키지)는 실행 파일(ELF), 오브젝트(.o), 라이브러리(.a) 안에포함된 심볼-‐함수·변수·섹션·링커 심볼-‐을 목록화해주소·크기·속성(정의/미정의, 글로벌/로컬 등)을 보여주는 전통
jinolab.tistory.com
반응형
'iOS > Modularization' 카테고리의 다른 글
| SPM vs Framework (0) | 2025.02.28 |
|---|