[iOS] Jailbreak Detection

hack_98·2023년 2월 6일
1

iOS

목록 보기
6/6

1. Jailbreak Detection (탈옥탐지)

  • iOS탈옥은 샌드 박스를 풀어 서명되지 않은 코드를 실행할 수 있게 하는 과정
  • 탈옥된 단말기에서 앱 실행을 어렵게 하기 위해 리버싱 방어 기능을 추가함
  • 탈옥 여부 확인 방법
    1. 파일 권한 확인, 샌드박스 외부에 파일 생성
    2. 프로토콜 핸들러 ( cydia:// ) 를 설치
    3. 시스템 API를 호출하는것으로 여부 확인 가능

1. 탈옥 탐지 사용되는 tool

1) 사용되는 Tool

  • Ghidra 기드라

  • Frida 프리다

    • 오픈소스로 DBI 프레임 워크
    • 자바스크립트를 네이티브 앱에 삽입 가능, 다양한 플랫폼에 인젝션이 가능
    • 스크립트 가능/ 멀티 플랫폼 / Battle-tested / Free and open-source
    • 함수 후킹, 디버깅, 힙 메모리 내 검색, 암호 해독 등 기능

2) Frida 문법

  • ObjC.available
    • 현재 프로세스에 Objective-C 런타임이 로드 되었는지 여부
    • 해당 앱에서 Frida가 실행 가능한 환경인지 검사 !
  • ObjC.classes
    • 현재 등록된 클래스에 대한 ObjC.object 자바스크립트 바인딩에 대한 오브젝트 맵핑 클래스 이름
    • 프로세스에 로드된 클래스들의 이름을 보여줌
  • Interceptor.attach(target,callback[,data])
    • target에서 함수에 대한 호출을 가로챔 (호출을 가로채고자 하는 함수의 주소를 지정 NativePointer)
    • callbacks 인수는 하나 이상을 포함하는 오브젝트(객체)
      • onEnter:function(args)
        : NativePointer 객체의 배열로 인수를 읽고 쓰는 하나의 인수 args
      • onLeave:function(retval)
        : 원래 return값을 포함하는 NavtivePointer 에서 파생 객체인 인수 retval이 제공된 callback함수
        : retval.replcae(ptr(0x1234))를 포인터로 변경 가능
  • Module.findBaseAddress(name)
  • Module.getBaseAddress(name)
    • name모듈의 base주소를 반환
    • 모듈을 찾을 수 없는 경우, find-prefixed 함수는 null 반환 / get-prefixed 함수는 예외 발생
  • NativePointer(new NativePointer(s))
    • 메모리 주소를 10진수 또는 16진수로 포함하는 문자열(s)에서 새로운 NativePointer를 생성
    • 간결하게 ptr(s)로 사용 가능

< 객체 속성>

  • $methods
    • 주어진 객체의 클래스와 부모 클래스에 의해 노출된 기본 메소드 이름을 포함하는 배열
  • $ownMethods
    • 부모 클래스를 포함하지 않고, 주어진 객체의 클래스에 의해 노출된 기본 메소드 이름을 포함하는 배열
  • context
    • 프로세스별 키가 있는 객체
    • 이 키에 할당한여 레지스터 값을 업데이트 가능



2. 탈옥 탐지 사용되는 tool

1) 정적 분석

  • 바이너리 IDA를 통해 분석 → string 검색으로 “jailbreaken”발견
  • 해당 부분을 호출하는 위치를 확인해보면, 분기문을 통해 실행경로가 나눠지는 것을 확인
    • tbz w0,#0x0,LAB_1001cc17c’ 로 해당 결과에 따라 분기가 나뉨

2) ASLR 적용여부 확인

(ASLR : 메모리 손상 취약점 공격을 방지하기 위한 기술, 프로그램 호출마다 메모리 주소 바뀜)

#otool -Vh [바이너리 명] 명령어 입력 !
- 헤더 값에서 PIE ASLR이 적용됨을 의미함

3) hooking

  • Frida를 사용하여 해당 부분을 후킹하여 우회하기

    var realBase = Module.findBaseAddress('DVIA-v2')
    console.log(realBase)
    
    var Jailbreak_address=realBase.add('0x1cbdd0')
    console.log(Jailbreak_address)
    
    Interceptor.attach(Jailbreak_address, {		
        onEnter:function(args){
            console.log(JSON.stringify(this.context))
        }
    })
  • 메모리에 할당된 레지스터 값 확인 및 분석 가능

<레지스터 표현 방식>
64bit 환경에서는 x0 ~ x30 으로 표현
32bit 환경에서는 w0 ~ w30 으로 표현

profile
Go Big or Go Home

1개의 댓글

comment-user-thumbnail
2023년 2월 8일

글이 아주 귀엽고 멋있으시네요 ^^

답글 달기