분석방법

구조

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

  • 데이터 경로(읽기/쓰기) : /private/var/mobile/Containers/Data/Application/<UUID-1>/...
  • 번들 경로(읽기전용) : /private/var/containers/Bundle/Application/<UUID-3>/<App>.app
  • 공유 경로 : /var/mobile/Containers/Shared/AppGroup/<UUID-2>/
    앱과 확장프로그램이 공유하는 공간이다. 보통 메신저의 대화 DB나 로그인 세션토큰 등이 저장된 경우가 있다.
  • 클라우드 경로 : /var/mobile/Library/Mobile Documents/
    파일 앱에서 보이는 iCloud Drive 데이터가 실제로 저장되는 로컬 경로이다.

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

69d05525-a459-4012-ab86-b7639b4de219
69d05525-a459-4012-ab86-b7639b4de219

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

uicache -l | grep <번들ID>

번들 경로의 UUID와 데이터 경로의 UUID가 다르다.
데이터경로의 모든 폴더에서 메타데이터 파일을 읽어서 번들아이디로 검색해야한다.

frida로 데이터 경로 획득

// Frida 스크립트: 데이터 컨테이너 경로 찾기
var fileManager = ObjC.classes.NSFileManager.defaultManager();
var urls = fileManager.urlsForDirectory_inDomains_(9, 1); // 9: DocumentDirectory, 1: UserDomainMask
var documentDir = urls.objectAtIndex_(0).path();

console.log("Data Container (Documents): " + documentDir);
console.log("Bundle Path: " + ObjC.classes.NSBundle.mainBundle().bundlePath());

터미널에서 검색하기

# 경로 이동
cd /var/mobile/Containers/Data/Application

grep -r "Messenger" ./*/.com.apple.mobile_container_manager.metadata.plist
# 결과:
# grep: ./6CA45768-6149-47C4-96BE-01577E10F481/.com.apple.mobile_container_manager.metadata.plist: binary file matches

최상단에 숨김파일로 .com.apple.mobile_container_manager.metadata.plist라는 파일이 있다. 이걸 읽어보면 MCMMetadataActiveDPClass_ 뒤에 나오는게 번들ID이다.

<데이터경로>/A41165C1-FF15-4041-85E0-B049A3ED3DF4 root# cat .com.apple.mobile_container_manager.metadata.plist
...
aSchemaVersion_MCMMetadataActiveDPClass_jp.co.yahoo.YNaviApp�

/ root# uicache -l | grep jp.co.yahoo.YNaviApp
jp.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로 받겠다는 의미.
    방화벽을 열거나 포워딩하는 작업은 필요없음

debugserver-14 0.0.0.0:23946 /private/var/containers/Bundle/Application/EF452469-13C1-4C39-9297-019091F9B16F/KakaoTalk.app/KakaoTalk
debugserver-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 같이쓰기

ios> uicache -l | grep -i YNavi
win> frida -U -f jp.co.yahoo.YNaviApp --pause    # 정지시켜놓기
ios> ps -ef | grep -i YNavi
501  4012     1   0  9:36AM ??         0:00.00 /var/containers/.../YNaviApp
ios> debugserver 0.0.0.0:23946 -a 3555           # pause된 프로세스에 attach
# 원래 YNavi의 부모프로세스가 1이였다가 debugserver의 pid로 변함
ios> ps -ef | grep -i YNavi
501  4012  4015   0  9:36AM ??         0:00.00 /var/containers/.../YNaviApp
  0  4015  3987   0  9:36AM ttys001    0:00.00 debugserver 0.0.0.0:23946 -a 4012
# Frida에서 %resume 하게되면 debugserver가 잡는다. 이때도 아직 스플래시화면에서 멈춰있는 상태
FRIDA> %resume
# %resume 하고나면 debugserver에서 두번째메시지가 뜸. 원랜 첫번째메시지까지만 표시됐음 
Attaching to process 4012...
Listening to port 23946 for a connection from 0.0.0.0...
# IDA 연결하면 attach 되고 suspend상태인데, run 하면 앱이 실행된다. 
# IDA, FRIDA 같이쓸수있음

파일 복호화

앱스토어로 설치된 앱 번들경로에는 FairPlay로 암호화된 상태이다. iOS에서 실행될때 dyld에서 메모리를 복호화해서 돌리기 때문에 복호화 덤프 후 사용해야한다.

그렇게 하지 않으면 libsystem 등만 보인다.

frida-server 버전낮추기

앱마다 다른 에러가 발생함

# 16.7.19
PS D:\worktemp\issue> frida -U -f com.eCareme.ASUSWebStorage
[Apple iPhone::com.eCareme.ASUSWebStorage ]-> Process terminated

PS D:\worktemp\issue> frida -U -f com.iwilab.KakaoTalk
[Apple iPhone::com.iwilab.KakaoTalk ]-> Process terminated

# 17.4.1
PS D:\worktemp\issue> frida -U -f com.eCareme.ASUSWebStorage
[Apple iPhone::com.eCareme.ASUSWebStorage ]-> Process terminated

PS D:\worktemp\issue> frida -U -f com.iwilab.KakaoTalk
Failed to spawn: unable to launch iOS app via FBS: The request to open "com.iwilab.KakaoTalk" failed.

frida 릴리즈에서 iphoneos-arm64.deb 받기

scp .\frida_16.7.19_iphoneos-arm64.deb root@192.168.50.151:/var/jb/var
dpkg -i frida_16.7.19_iphoneos-arm64.deb

로그 보기

idevicesyslog 이거 쓰면되는데 logcat처럼 터미널에 표시된다.

Comments

ESC
Type to search...