분석방법
2025년 10월 28일
구조 #
iOS는 앱 설치 시 번들경로와 데이터 경로로 나뉜다.
- 데이터 경로(읽기/쓰기) :
/private/var/mobile/Containers/Data/Application/<UUID>/... - 번들 경로(읽기전용) :
/private/var/containers/Bundle/Application/<다른-UUID>/<App>.app
번들 아이디는 3uTools에서 확인할수도 있고, uicache -l 로 수동으로 찾을수도 있다.
번들 경로를 획득할 수 있다.
1uicache -l | grep <번들ID>
번들 경로의 UUID와 데이터 경로의 UUID가 다르다.
데이터경로의 모든 폴더에서 메타데이터 파일을 읽어서 번들아이디로 검색해야한다.
최상단에 숨김파일로 .com.apple.mobile_container_manager.metadata.plist라는 파일이 있다. 이걸 읽어보면 MCMMetadataActiveDPClass_ 뒤에 나오는게 번들ID이다.
1<데이터경로>/A41165C1-FF15-4041-85E0-B049A3ED3DF4 root# cat .com.apple.mobile_container_manager.metadata.plist
2...
3aSchemaVersion_MCMMetadataActiveDPClass_jp.co.yahoo.YNaviApp�
4
5/ root# uicache -l | grep jp.co.yahoo.YNaviApp
6jp.co.yahoo.YNaviApp : /private/var/containers/Bundle/Application/6FD2D5D6-5003-4CAE-83CE-18B570F9058A/YNaviApp.app
앱번들 경로에서 <앱이름>.app/<앱이름> 파일이 분석할 대상 바이너리이다.
시스템 프레임워크, 라이브러리를 포함해서 같이 분석하면 될것이다.
IDA 동적디버깅 세팅 #
-
sileo 에서 gdbserver 설치
llvm 버전이 안맞아서 크래시가 발생하는 상황이 있기 때문에 14, 16 버전 전부 시도해봐야한다. llvm버전이 운영체제때문에 영향을 받는건지 앱기준인지는 몰루 -
debugserver로 대기하기 외부에서 접근하는 모든 IP에서 23946포트로 들어오는걸 debugserver로 받겠다는 의미.
방화벽을 열거나 포워딩하는 작업은 필요없음
1debugserver-14 0.0.0.0:23946 /private/var/containers/Bundle/Application/EF452469-13C1-4C39-9297-019091F9B16F/KakaoTalk.app/KakaoTalk
2debugserver-14 0.0.0.0:23946 --atach=<PID>
- IDA에서 실행할 바이너리 세팅하고, Hostname은 기기 ip 설정, 포트는 23946으로 설정
너무 느려서 usb로 하고싶을땐
https://code.google.com/archive/p/iphonetunnel-usbmuxconnectbyport/downloads
그리고 이제 Windows 로 돌아와서 해당 링크를 통해 itunnel_mux_rev71.zip 을 다운 받는다. itunnel 프로그램은 iPhone 과 Windows 사이의 usb 터널링을 돕는 프로그램이다.
itunnel_mux.exe –iport 23946 –lport 2222
[FATAL] Could not locate ‘Apple Mobile Device Support’ 에러가 뜬다면,….
https://drive.google.com/file/d/1x0ICdWPQ8cDgpEGstgkN7mwteaEc4ETx/view?usp=sharing
해당 itunes 드라이버를 설치해준 뒤 다시 itunnel 을 실행하면 해결된다. iOS 12 이상에서 시도할 때 생기는 오류라고 한다.
IDA에서 127.0.0.1:2222 로 접근하면 debugserver에 연결된다.
frida ida 같이쓰기 #
1ios> uicache -l | grep -i YNavi
2win> frida -U -f jp.co.yahoo.YNaviApp --pause # 정지시켜놓기
3ios> ps -ef | grep -i YNavi
4501 4012 1 0 9:36AM ?? 0:00.00 /var/containers/.../YNaviApp
5ios> debugserver 0.0.0.0:23946 -a 3555 # pause된 프로세스에 attach
6# 원래 YNavi의 부모프로세스가 1이였다가 debugserver의 pid로 변함
7ios> ps -ef | grep -i YNavi
8501 4012 4015 0 9:36AM ?? 0:00.00 /var/containers/.../YNaviApp
9 0 4015 3987 0 9:36AM ttys001 0:00.00 debugserver 0.0.0.0:23946 -a 4012
10# Frida에서 %resume 하게되면 debugserver가 잡는다. 이때도 아직 스플래시화면에서 멈춰있는 상태
11FRIDA> %resume
12# %resume 하고나면 debugserver에서 두번째메시지가 뜸. 원랜 첫번째메시지까지만 표시됐음
13Attaching to process 4012...
14Listening to port 23946 for a connection from 0.0.0.0...
15# IDA 연결하면 attach 되고 suspend상태인데, run 하면 앱이 실행된다.
16# IDA, FRIDA 같이쓸수있음
파일 복호화 #
앱스토어로 설치된 앱 번들경로에는 FairPlay로 암호화된 상태이다. iOS에서 실행될때 dyld에서 메모리를 복호화해서 돌리기 때문에 복호화 덤프 후 사용해야한다.
그렇게 하지 않으면 libsystem 등만 보인다.
frida-server 버전낮추기 #
앱마다 다른 에러가 발생함
1# 16.7.19
2PS D:\worktemp\issue> frida -U -f com.eCareme.ASUSWebStorage
3[Apple iPhone::com.eCareme.ASUSWebStorage ]-> Process terminated
4
5PS D:\worktemp\issue> frida -U -f com.iwilab.KakaoTalk
6[Apple iPhone::com.iwilab.KakaoTalk ]-> Process terminated
7
8# 17.4.1
9PS D:\worktemp\issue> frida -U -f com.eCareme.ASUSWebStorage
10[Apple iPhone::com.eCareme.ASUSWebStorage ]-> Process terminated
11
12PS D:\worktemp\issue> frida -U -f com.iwilab.KakaoTalk
13Failed to spawn: unable to launch iOS app via FBS: The request to open "com.iwilab.KakaoTalk" failed.
frida 릴리즈에서 iphoneos-arm64.deb 받기
1scp .\frida_16.7.19_iphoneos-arm64.deb root@192.168.50.151:/var/jb/var
2dpkg -i frida_16.7.19_iphoneos-arm64.deb
로그 보기 #
idevicesyslog 이거 쓰면되는데 logcat처럼 터미널에 표시된다.