티스토리 뷰

IOS

[IOS] / iPA 분석

삼전동해커 2024. 12. 13. 20:09

iPA

iOS App-Store Package의 줄임말로, iOS 애플리케이션 아카이브 파일.

개발 코드와 번들, 사이닝, 리소스 파일 등이 포함되어 있다.

iPA 구하기

iPA를 구하는 방법은 여러가지가 있다.

  1. ipatool
  2. 3utools
  3. Xcode 아카이브
  4. frida-ios-dump

frida-ios-dump로 iPA를 받아보자.
먼저 ios 장치(실험용 아이폰)와 Pc 모두 frida가 설치되어 있어야 한다.

분석 대상 앱: QQBrowser
ios 장치: iPhone6s
버전: ios 15.8.3

  1. frida-ios-dump 설치
    먼저 장치와 pc를 usb로 연결하고 ssh로 접속을 해둔다.
    https://github.com/AloneMonkey/frida-ios-dump

git clone하고 디렉토리 내에서 dump.py를 수정해야 한다.
35번 째 줄부터 password랑 장치의 ip를 알맞게 수정한다.

    1. 분석 대상 앱 이름 알아내기
      그리고 다음 명령어로 장치에 설치된 앱에 대한 프로세스 정보를 확인한다.
      $ python dump.py -l

      Name이 우리가 아는 앱의 이름이고 identifier를 사용해야 한다.
      분석 대상인 QQBrowser의 Identifier는 com.tecent.mttlite이다.
    2. dump 하기
      $python dump.py com.tecent.mttlite
      명령어를 실행하여 ios 앱의 dump를 수집할 수 있다.
      이 때, 꼭 앱이 실행되고 있는 상태여야 한다.
      결과로 앱이름.ipa가 생성되고, 이를 앱이름.ipa.zip으로 변경하여 압축해제하면 된다.
    3. 수집한 dump 파일 열기
      압축해제하면 Payload 디렉토리 내에 앱이름 비슷하게 파일이 하나 있다.
      우클릭 후 패키지 내용 보기로 앱에 포함된 파일들을 확인할 수 있다.

 

 

Mach-o 구조

macOS와 iOS에서 사용되는 바이너리의 형식으로, 여러 아키텍처에서 실행할 수 있는 fat 바이너리이다.

 

$ otool -hv [분석하고자 하는 앱 이름]
이 명령어로 헤더 정보 확인이 가능하다.

여기서 분석하고자 하는 앱 이름은 payload -> 앱 패키지 -> 앱 이름을 넣어야 한다.

가장 용량이 큰 파일이 분석할 바이너리가 된다.

 

구조는 다음과 같다.

Header - 파일의 기본 정보를 담고 있는 부분

Load Commands - 파일의 구성 요소를 로드하기 위해 사용하는 명령 리스트

Segments & Section - Segment는 메모리에 매핑되는 데이터들로, 바이너리 코드, 데이터, 스택 등이 있다. Section은 각 Segment들을 나눈 단위이다. 

 

Header

 

magic - 파일의 식별자

cputype - CPU 아키텍처 정보

cpusubtype - 세부 cpu 모델

filetype - 실행 파일, 공유 파일 등 파일 유형 정보

ncmds - 로드 커맨드 개수

sizeofcmds - 로드 커맨드의 총 크기

flags - 플래그 정보, 디버그 정보 등

플래그의 PIE는 바이너리 주소가 랜덤으로 배정된다는 플래그이다.

 

Load Commands

각 커맨드에 대한 정보와 segment의 offset 등을 담을 배열이 존재

다음 명령어로 커맨드 정보를 확인할 수 있다.

$ otool -l 앱이름

Load command 74

      cmd LC_DATA_IN_CODE

      cmdsize 16

      dataoff 67258816

      datasize 7688

      path @executable_path/Frameworks (offset 12)

     name /System/Library/Frameworks/UserNotifications.framework/UserNotifications

 

cmd - command의 종류

cmdsize - 크기

dataoff - 해당 데이터가 시작되는 위치 오프셋

name - 명령어가 의존하는 동적라이브러리 이름

 

Segments

세그먼트에는 바이너리의 바이트 범위와 정적 파일 내 오프셋, 메모리에 매핑되는 주소, 메모리 보호 속성 등이 정의되어 있다.

 

__PAGEZERO - 첫번째 세그먼트로 가상 메모리의 0에 위치, 데이터가 없어 바이너리에서는 크기가 0이지만, 가상 메모리에서는 1페이지를 받는다.

__text - 실제 실행 코드 세그먼트, Header와 Load Command를 포함한다.

__cstring - 문자열 상수

__data - 초기화된 데이터

 

 

'IOS' 카테고리의 다른 글

[iOS] / frida script 코드 예시  (2) 2024.12.19
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함