[iOS] How to Debug with IDA

koo00·2023년 4월 11일
0

I. Intro

IDA 에서 iOS 동적 디버깅을 하려고 예전에 작성해둔 포스팅이 있는데, 환경이 달라지면서 리뉴얼 겸 새로 포스팅하려 한다.

테스트 폰이 바뀌면서 debugserver 를 새로 다운로드 받았어야 했는데, 맥북이 생겼기 때문에 Xcode 에서 debugserver 를 추출했다.

debugserverXcode 에서 프로젝트 하나 만들고 테스트 폰과 연결 하여 Build & Run 시키면 테스트 폰의 /Developer/usr/bin 디렉터리에서 찾을 수 있다.

이때 /Developer 디렉터리는 읽기 전용이며 단말기를 재부팅시킬 경우 디렉터리가 삭제되기 때문에 debugserver 를 새로운 디렉터리로 복사해주면 된다.

이제 디버깅을 위한 세팅을 해보자.


II. Run debugserver

아래의 명령어를 입력해서 debugserver 를 실행시킨다.

# ./debugserver 127.0.0.1:23946 &

아래와 같은 에러가 발생하며 실행할 수 없다.

Listening to port 23946 for a connection from 127.0.0.1...
Failed to get connection from a remote gdb process.

debugserver 페이지에서 확인해보면 아래의 내용이 나와있는데, debugserver는 task_for_pid() 를 허용할 자격이 없기 때문에 App Store의 다른 앱을 포함하여 다른 프로세스에 연결할 수 없다.

따라서 get-task-allowtask_for_pid-allow 자격을 추가해주기 위해 다음을 entitlements.xml 로 저장했다.

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>com.apple.springboard.debugapplications</key>
	<true/>
	<key>get-task-allow</key>
	<true/>
	<key>task_for_pid-allow</key>
	<true/>
	<key>run-unsigned-code</key>
	<true/>
</dict>
</plist>

아래의 명령어를 입력해서 debugserver 서명을 새로 하고 재시도한다.

# ldid -Sentitlements.xml debugserver
# ./debugserver 127.0.0.1:23946 &

debugserver 가 정상적으로 실행되었다. 이때 *:23946 로 실행할 경우 어태치가 제대로 안되므로 꼭 IP를 지정해줘야 한다.

추가로 debugserver 실행 시 Killed: 9 문구만 뜨고 실행이 되지 않으면 debugserver 파일을 /usr/bin 디렉터리 안에 넣고 시도해보자.


III. Run itunnel_mux

itunnel_mux_rev71.zip 파일을 다운받아 압축을 풀고, 다음과 같이 명령어를 입력한다.

> .\itunnel_mux.exe --iport 23946 --lport 23946

그 결과 아래와 비슷한 에러가 발생한다면 iTunesDriver64 설치 후 재시도한다.

[FATAL] Could not locate 'Apple Application Support' folder path in registry: ABORTING


재시도하면 아래와 같이 디버깅할 준비가 완료된 것을 볼 수 있다.


IV. Attach to Process

IDA 에서 디버거를 아래와 같이 세팅 후 어태치 해준다.

Debeugger > Select debugger > Remote iOS debugger

Debugger > Process options

이때 Application 에 디버깅하고자 하는 앱의 실제 경로(/var/containers/Bundle/Application/~~~/testgame.app/testgame) 를 넣어주고 Debugger > Start process (F9) 로 실행시킬 경우 바로 어태치가 가능하다.

다만 이렇게 디버깅을 시작해도 앱이 켜지는 건 아니라서 정확한 분석은 어렵다.

보통은 앱을 실행시킨 뒤 앱의 PID 를 확인해서 Debugger > Attach to process 로 어태치한다.

짜잔~


V. Spawn to Process

하지만 보안 솔루션을 분석하거나 안티 디버깅이 적용되어 있을 경우 어태치 할 수 없기 때문에 앱을 실행과 동시에 디버깅해야 한다.

이럴 때는 debugserver--waitfor 옵션을 추가해주면 된다.

# debugserver 127.0.0.1:23946 --waitfor=testgame


해당 명령어 입력 후 앱 실행할 경우 검은 화면에서 멈춰 있는데, 이때 Debugger > Attach to process > OK 버튼을 클릭하면 별도의 PID 입력 없이 바로 디버깅이 가능하다.

만약 FridaIDA 모두 활용하고 싶다면 다음의 순서로 실행한다.

// 1. Windows 에서 Frida 로 앱 실행(spawn)
> frida -U -f com.xxx.testgame -l hook.js

// 2. 실행된 앱 PID 확인
> frida-ps -Uai | findstr testgame
26274  testgame                   com.xxx.testgame

// 3. iPhone 에서 해당 PID에 attach
# debugserver 127.0.0.1:23946 --attach=26274

// 4. Frida CLI 에서 메인 및 스크립트 실행
[Apple iPhone::com.xxx.testgame ]-> %resume

// 5. IDA 에서 Debugger > Attach to process

VI. Outro

세팅하면서 삽질했던 내용을 정리하고 포스팅을 마무리한다.

  • debugserver 서명은 위에서 작성한 파일로 가능하다.
  • debugserver 의 권한을 굳이 변경할 필요가 없다. (755)
  • debugserver 실행 시 반드시 IP를 지정해야 한다.
  • attach 를 하기 위해 debugserver 실행 시 포트와 itunnel_mux 실행 시 iportlport, IDA 에서 Process options 의 포트를 전부 통일해준다.
  • FridaIDA 동시에 활용하고 싶을 경우 Frida 로 먼저 spawn 하고 신속하게 debugserver 를 세팅해야 한다.
profile
JFDI !

0개의 댓글