IDA
에서 iOS 동적 디버깅을 하려고 예전에 작성해둔 포스팅이 있는데, 환경이 달라지면서 리뉴얼 겸 새로 포스팅하려 한다.테스트 폰이 바뀌면서
debugserver
를 새로 다운로드 받았어야 했는데, 맥북이 생겼기 때문에Xcode
에서debugserver
를 추출했다.
debugserver
는Xcode
에서 프로젝트 하나 만들고 테스트 폰과 연결하여 Build & Run시키면 테스트 폰의/Developer/usr/bin
디렉터리에서 찾을 수 있다.이때
/Developer
디렉터리는 읽기 전용이며 단말기를 재부팅시킬 경우 디렉터리가 삭제되기 때문에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-allow
및 task_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
디렉터리 안에 넣고 시도해보자.
itunnel_mux_rev71.zip 파일을 다운받아 압축을 풀고, 다음과 같이 명령어를 입력한다.
> .\itunnel_mux.exe --iport 23946 --lport 23946
그 결과 아래와 비슷한 에러가 발생한다면 iTunesDriver64 설치 후 재시도한다.
[FATAL] Could not locate 'Apple Application Support' folder path in registry: ABORTING
재시도하면 아래와 같이 디버깅할 준비가 완료된 것을 볼 수 있다.
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
로 어태치한다.
짜잔~
하지만 보안 솔루션을 분석하거나 안티 디버깅이 적용되어 있을 경우 어태치 할 수 없기 때문에 앱을 실행과 동시에 디버깅해야 한다.
이럴 때는 debugserver
에 --waitfor
옵션을 추가해주면 된다.
# debugserver 127.0.0.1:23946 --waitfor=testgame
해당 명령어 입력 후 앱 실행할 경우 검은 화면에서 멈춰 있는데, 이때 Debugger
> Attach to process
> OK
버튼을 클릭하면 별도의 PID 입력 없이 바로 디버깅이 가능하다.
만약 Frida
와 IDA
모두 활용하고 싶다면 다음의 순서로 실행한다.
// 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
세팅하면서 삽질했던 내용을 정리하고 포스팅을 마무리한다.
debugserver
서명은 위에서 작성한 파일로 가능하다.debugserver
의 권한을 굳이 변경할 필요가 없다. (755)debugserver
실행 시 반드시 IP를 지정해야 한다.attach
를 하기 위해debugserver
실행 시 포트와itunnel_mux
실행 시iport
및lport
,IDA
에서Process options
의 포트를 전부 통일해준다.Frida
와IDA
동시에 활용하고 싶을 경우Frida
로 먼저spawn
하고 신속하게debugserver
를 세팅해야 한다.