분석방법

분석방법

2025년 10월 28일

구조 #

iOS는 앱 설치 시 번들경로와 데이터 경로로 나뉜다.

  • 데이터 경로(읽기/쓰기) : /private/var/mobile/Containers/Data/Application/<UUID>/...
  • 번들 경로(읽기전용) : /private/var/containers/Bundle/Application/<다른-UUID>/<App>.app

번들 아이디는 3uTools에서 확인할수도 있고, uicache -l 로 수동으로 찾을수도 있다. 69d05525-a459-4012-ab86-b7639b4de219

번들 경로를 획득할 수 있다.

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 동적디버깅 세팅 #

  1. sileo 에서 gdbserver 설치
    llvm 버전이 안맞아서 크래시가 발생하는 상황이 있기 때문에 14, 16 버전 전부 시도해봐야한다. llvm버전이 운영체제때문에 영향을 받는건지 앱기준인지는 몰루

  2. 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>
  1. 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처럼 터미널에 표시된다.

comments powered by Disqus