4. iOS 애플리케이션 구조
[목차]
1. iOS 애플리케이션 구조
- default 또는 탈옥 앱 디렉터리
- 앱스토어 앱 디렉터리
- 데이터 디렉터리(컨테이너)
- iOS 키체인
2. Mach-O 및 Fairplay DRM 소개
- Mach-O 바이너리 파일
- Fairplay DRM
-바이너리 DRM 설정 확인 실습
- 캐치딜(App Store)
- DVIA-v2(Non App Store)
* 앱이 디바이스에 설치 되었을 때 구조를 분석해 본다.
1. iOS 애플리케이션 구조

* iOS keychain
: 모든 애플리케이션에 대한 중요한 값(사용자 계정 정보, 네트워크 암호, 인증 토큰 등)을
암호화 하여 DB에 저장 (리버싱 마스터들이 복호화 로직 툴을 만들어 배포해줌)
1) 사전에 설치된 default 앱 및 탈옥 앱 디렉터리
: Applications (Jailbreak) 폴더

- 탈옥 전에는 default로 깔린 앱 삭제가 불가능 하지만
탈옥 후에는 가능함(하지만 삭제 후 재설치는 불가!)
- 탈옥 전에는 default 앱들에 대한 설정이 불가능 하지만
(예. 무음카메라) 탈옥 후에는 설정 가능함
- 3utools에서 구조를 살펴보면

default로 깔린 앱스토어 및 탈옥을 통해 설치한
Cydia 등이 모두 이곳에 있음
2) 앱스토어를 통해 설치한 앱 디렉터리
: Applications (User) 폴더


설치 폴더가 uuid로 구분되는 경우
진단 해야하는 앱이 어떤 디렉터리에 있는지
식별하기가 어렵기 때문에 정렬 순을
최신 순으로 바꾸는 습관!
3) 데이터 디렉터리(컨테이너)
: 내부 중요 데이터가 모두 저장됨!


4) iOS Keychain
: 복호화 실습 별도 진행


2. Mach-O 및 Fairplay DRM 소개
1) Mach-O 바이너리 파일
: 앱스토어 또는 직접 앱 설치 시
해당 실행 파일, 바이너리 파일은
마크 오브젝트 파일로 구성되어 있다.
해당 바이너리 파일은 추후
기드라(Ghidra)라는 디버깅 툴로
분석 실습을 진행해볼텐데
마크 오브젝트 바이너리 파일이
어떤 구조로 어떻게 구성되어 있는지
이해하고 있으면 분석하는데 있어
큰 도움이 된다.


: 마크 오브젝트 바이너리 파일은
Header / Load Commands / Data
세 부분으로 이루어져 있는데
- Header는 마크 오브젝트라는 파일 형식을 설명하고
파일 해석에 영향을 미치는 플래그 값이 있다.
- Load Commands는 데이터 영역에 대한
레이아웃을 지정해 주고 필요한 세부 정보들을
포함하고 있다.
- Data 영역은 실행에 필요한 데이터가 들어있다.
2) Fairplay DRM 소개

: DRM 적용이 되어있는지 여부를 확인하는 방법은
Object Tool(Otool)을 통해 바이너리 형식 확인 가능.
cryptid 1 = DRM 적용된 것 (앱스토어 앱)
cryptid 0 = DRM 적용 안된 것
실무에서는 개발자 분들이
IPA 파일을 직접 주시는 경우
보통 Fairplay DRM이 걸려있지 않은
바이너리 파일이지만
개발 앱 제공이 안되고 앱스토어에서
받으라고 하는 경우는 암호화가 걸려있기 때문에
받아서 별도의 복호화(해독)를 진행해야함.
> 이때 사용하는 툴이 바로 frida-ios-dump로
해독을 하면 바이너리 작동 방식 및
내부 클래스 구조 등 파악이 가능해 진다.
# 바이너리 DRM 설정 확인 실습
A. 캐치딜 (App Store)
1) 3utools로 단말기 연결 후 ssh 활성화
2) putty 또는 mobaxterm으로 ssh 접속
3) 바이너리 분석을 하기 위해 우선 번들 컨테이너에 접근해야 함
> /var/containers/Bundle/Application/

uuid 값으로는 식별이 어렵기 때문에
설치 날짜로 구별하던가
3utools로 확인

'캐치딜' 폴더 들어간 뒤 uuid 번호 확인

다시 putty에서
해당 폴더로 들어간 뒤
(/var/containers/Bundle/Application/2CD957EE-F531-4422-AD2F-113B0E2594DD/catchDeal.app)
바이너리 파일 이름 확인 (catchDeal)

4) otool 실행
# otool -l catchDeal | grep -A4 LC_ENCRYPTION_INFO

1로 설정
FailPlay DRM 걸려있음
B. DVIA-v2 (Non App Store)
1) DVIA(Damn Vulnerable iOS Application) 다운 후 설치
https://github.com/prateek147/DVIA-v2
1-1) 3utools에서 Import&Insall ipa 클릭

1-2) DVIA-v2-swift.ipa 파일 선택

1-3) 설치완료

2) DVIA 바이너리 파일 경로 확인 후 접속
2-1) uuid 확인


2-2) 디렉터리 접속

3) otool 실행
# otool -l DVIA-v2 | grep -A4 cryptid

0으로 설정
FailPlay DRM 안 걸려있음
실습 종료
# 내용 및 일부 이미지 출처
: 보안프로젝트 김태영 팀장 iOS 모바일 앱 모의해킹(기초) 강의 PDF