🤛🏽

매뉴얼 리패키징 (non-JB 장치로 분석하는 방법) - 보충필요

원리는 알겠는데 실습이 제대로 동작 안했음. - 보충 필요

ios) 앱 매뉴얼 리패키징 Manual Repackaging

 
non-jailbroken device에서 동적 분석을 하고자 한다면
  1. 앱 시작 시 동적라이브러리(dylib)을 로드하도록 패치 한 후
  1. 리패키징 해야 한다.
==> 물론 샌드박스를 깰 순 없지만, 비탈옥장치에서도 instrument를 비롯한 다양한 동적분석이 가능해진다.
==> FairPlay-encrypted를 푼 상태에서 수행해야함.

* Developer Provisioning Profile과 Certificate 얻기

 
provisioning profile은 Apple에서 서명한 plist file로, 승인된 인증서 목록에 내 코드 서명 인증서를 추가한다.
다시 말해, 이는 Apple이 선택한 기기(development profile)에서 디버깅과 같은 특정 이유로 앱 실행을 명시적으로 허용함을 뜻한다.
프로비저닝 프로파일에는 앱에 부여된 entitlement도 포함되며, Certificate에는 서명하는 데 사용할 개인 키가 들어 있다.
 
iOS 개발자로 등록되었는지 여부에 따라 다음 방법 중 하나로 Certificate 및 Provisioning Profile을 얻을 수 있다.
 

1. iOS 개발자 계정

이전에 Xcode로 iOS 앱을 개발 및 구축했다면, 이미 자신만의 code-sining certificate가 설치돼 있다.
 
  • [signing identity 확인]
security 툴로 현재 설치된 sining identities를 확인하자.
$ security find-identity -v
맥 콘솔에서 위 명령어를 쳤을 때
1) 5EB708C...3C0600AB(총40글자, 이게 siginin identity) "iPhone Developer: 이름 (~~~)"
이런식으로 조회 된다면 됨. (계정이 없어서 테스트는 못해봄)
 
  • [certificat 및 provisioning profile 획득]
Apple Developer 포털 사이트에 로그인하고 새로운 App ID를 issue하고 profile을 다운로드 하자.
provisioning profile은 development profile으로 발급받아야 앱 디버깅 가능. (distribution profile ㄴㄴㄴ)
 
distribution profile은 entitlements.xml에 다른 프로세스에서 붙을 수 있는 get-task-allow 속성이 없음.
물론 추가하면 되겠지만 귀찮음..
 
 

2. 일반 Apple 계정 (무료 사용자도 가능)

 
  • [provisioning profile 획득]
애플 계정이 있으면 기본적으로 free development provisioning profile을 제공한다.
 
  1. Xcode 열어서 깡통 프로젝트 생성하고
  1. 실제 아이폰 디바이스로 빌드시키고
  1. app container에서 embedded.mobileprovision 추출
 
notion image
$ cd ~/Library/Developer/Xcode/DerivedData/<ProjectName>/Build/Products/Debug-iphoneos/<ProjectName>.app/ $ ls #embedded.mobileprovision 찾아서 복사.
이렇게 콘솔로 접근해도 되지만, 아래 그림처럼 편하게 추출하자.
notion image
notion image
embedded.mobileprovision 추출
이 provisioning profile은 동일한 AppID(TeamID.BundleID)를 가진 앱에서만 유효하므로, 앱의 AppID를 맞춰줘야 하는데, 곧 보게 될테니 지금은 인지만 하고 있자.
  • TeamID : 애플에서 생성
  • BundleID : 내가 임의로 지정한 앱 번들 이름 (예. com.company.product)

Provisioning Profile 획득 후 공통 작업 (개발자 계정, 기본계정)

 

entitlements.plist 추출하기

notion image
embedded.mobileprovision을 얻었으면 이걸 이용해서 entitlements.plist를 추출하면 됨.
여기서 얻은 entitlements.plist로 테스트앱 바이너리를 re-sign 할 것이므로 필요하다.
 
다른 프로세스에서 attach할 수 있도록 get-task-allow값도 true로 설정된 것을 볼 수 있다.
 

* dylib 삽입 후 리패키징

 

1. IPA 파일 획득, 압축해제

먼저 동적분석하고자 하는 앱의 IPA 파일을 획득한다.
IPA 파일형식은 사실 ZIP 형태이므로, 압축을 해제하여 내부 구성을 살펴볼 수 있다.
$ unzip 앱.ipa
 

2. 동적라이브러리 복사

이제 동적라이브러리를 삽입할 건데, 많이 사용되는 FridaGadget.dylib을 이용해 보자.
아래 명령어로 FridaGadget.dylib를 다운로드 할 수 있다.
$ curl -O https://build.frida.re/frida/ios/lib/FridaGadget.dylib $ cp FridaGadget.dylib 앱.app #패치하고자 하는 앱의 app디렉토리에 dylib 복사
 

3. Mach-O 바이너리 수정

FridaGadget.dylib를 패치하고자 하는 app디렉토리로 복사하고, optool을 이용해서 바이너리의 Mach-O 구조의 Load command에 추가한다.
optool 설치방법
$ optool install -c load -p "@executable_path/FridaGadget.dylib" -t Payload/앱.app/앱바이너리파일 #[로그] Found FAT Header Found thin header... Found thin header... Inserting a LC_LOAD_DYLIB command for architecture: arm Successfully inserted a LC_LOAD_DYLIB command for arm Inserting a LC_LOAD_DYLIB command for architecture: arm64 Successfully inserted a LC_LOAD_DYLIB command for arm64 Writing executable to Payload/UnCrackable Level 1.app/앱바이너리...
분석을 담당할 dylib를 추가하고 바이너리에 명시하는 것까지 완료됐고, 정상 디바이스에서 실행될 수 있도록 적합한 인증서로 서명해야 한다.
 

4. 추출한 provisioning profile 복사

#빈 프로젝트를 만들어서 얻은 유효한 embedded.mobileprovision을 패치할 앱에 복사 $ cp <아까추출한embedded.mobileprovision> Payload/앱.app/embedded.mobileprovision
 

5. Info.plist의 BundleID 수정

서명 시 provisioning profile에 명시된 BundleID와 Info.plist에 명시된 BundleID와 일치해야한다.
따라서 Info.plist의 BundleID를 수정한다.
#provisioning profile에 명시된 BundleID와 동일하도록 Info.plist를 수정한다. $ /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier <앱번들ID>" Payload/앱.app/Info.plist
 

6.코드서명

마지막으로 코드서명을 통해 정상 디바이스에서도 실행될 수 있도록 만들면 끝이다.
signing identity는 문서 앞에서 다뤘던 security find-identity -v 명령어를 쳤을 때 나오는 것이다.
 
#기존의 코드사인을 지우고 $ rm -rf Payload/앱.app/_CodeSignature #개발자 sining identity로 dylib를 서명하고, $ /usr/bin/codesign --force --sign <signing identity> Payload/앱.app/FridaGadget.dylib #빈 프로젝트에서 추출했던 entitlement.plist로 앱 바이너리를 서명한다. $ /usr/bin/codesign --force --sign <signing identity> --entitlements <추출했던 entitlements.plist> Payload/앱.app/앱바이너리
설명은 명령어 앞의 주석으로 대체한다.
이로써 정상적으로 실행되도록 코드서명도 마쳤고 실행해 볼 일만 남았다.
 
#ios-deploy 설치하기 brew install ios-deploy
#deploy 수행하면 device에서 자동으로 앱이 실행된다. $ ios-deploy --debug --bundle Payload/앱.app
deploy 이후 디바이스에서 앱 실행까지 해 보자.
 
모든 게 다 잘됐다면 앱은 LLDB가 부착된 디버깅 모드로 시작될 것이다.
그러면 Frida 또한 앱에 부착할 수 있다. frida-ps 명령어로 테스트해 보자.
$ frida-ps -U [로그] PID Name --- ------ 499 Gadget
 

끝.


참고자료

 

기타 링크