반응형

Jailbreak Test1을 탭할 경우 팝업창이 뜸

 

시작점을 찾기 위해 Frida Attach하여 UI Dump수행

// Frida Code for Dumping UI

var window = ObjC.classes.UIWindow.keyWindow();
var rootControl = window.rootViewController();

var ui = window.recursiveDescription().toString();
var control = rootControl['- _printHierarchy']().toString();

// 현재 화면에 보여지는 UIController를 알고 싶은 경우
console.log(control); 

 

DVIA_v2.JailbreakDetectionViewController 클래스를 분석의 기준점으로 선정

 

IDA Pro에서 DVIA_v2.JailbreakDetectionViewController 검색

-[DVIA_v2.JailbreakDetectionViewController jailbreakTest1Tapped:] 메서드를 클릭하여 분석 시작

 

메서드 내에서 "Device is Jailbroken" 알람창을 띄우는 로직이 딱히 보이지 않음

BL(Branch with Link)    __T07DVIA_v232JailbreakDetectionViewControllerC20jailbreakTest1TappedyypF

지시어가 의심스러우므로 클릭하여 진입

 

__T07DVIA_v232JailbreakDetectionViewControllerC20jailbreakTest1TappedyypF 함수 내에서도 직접적으로 알람창을 띄우는 로직은 보이지 않음. 그러나, 많은 B(Branch) 지시어가 보이므로 lldb 동적 디버깅의 시작점으로 삼기에 적합

※ lldb 디버깅 환경 구성: https://hackcatml.tistory.com/46

 

lldb 로 DVIA-v2 프로세스에 attach하게 되면 앱 프로세스가 중단됨

c 명령어로 프로세스를 resume 시켜줌

 

그 후 다음 명령어로 디버깅 하고자 하는 함수의 주소에 breakpoint 설정

br s -a 0x<ASLR Offset>+0x<IDA Pro에서 함수의 시작주소>

 

분석하고자 하는 함수의 주소값은 다음 절차를 통하여 구함

image dump sections <appName>

 

ASLR Offset = 0x((red box) - (blue box))

예컨데, ASLR Offset이 0x2f30000이고, IDA Pro에서 함수의 시작주소가 0x100192C10 이라면 

br s -a 0x2f30000+0x100192C10 으로 브레이크포인트 설정

 

브레이크 포인트 설정 후 화면의 Jailbreak Test1을 탭하게 되면 breakpoint를 hit하게 됨

 

이제, n(Next, Step Over) 명령어로 arm 지시어를 하나씩 넘기면서 관찰을 진행

쭉 진행하다 의심스러운 blr(Branch with Link to Register) 지시어를 만난 경우, register read 명령어로 어디로 branch 되는지 확인. "~ -> Swift.Bool"이라고 나오는데, 알람창 띄우는 것이랑 관련 없어보이므로 Pass.

 

다시, n으로 진행하면 의심스러운 blr 지시어를 만나는데, register read 명령어를 수행하면 알람창 띄우는 것과 관련된 함수로 이동하는 것을 알 수 있음. s(Step In) 명령어로 branch된 함수 내부로 진입

 

함수 디버깅을 시작하기 전에, IDA Pro에서 그 함수가 어떤 형식으로 구성되었는지 살펴보는게 도움되므로, "showAlert"을 검색. IDA Pro 에서는 함수이름이 알아보기 어렵게 표시되어 있는데, 이는 Swift Name Mangling 때문으로, xcrun 명령어를 사용하면 demangling 된 함수이름을 얻을 수 있음

 

함수 내부를 살펴보면 TBZ(Test bit and Branch if Zero) 지시어에서 분기가 이루어져서 "Device is Jailbroken" 또는 "Device is Not Jailbroken"을 출력하는 것을 알 수 있음

 

목표는 lldb 명령어로 TBZ 지시어로 이동한 다음 register 값을 변경하여 분기 흐름을 변경시켜주는 것임

 

위 그림과 같이 TBZ 지시어에서 w0 레지스터의 값을 읽으면 1인 것을 알 수 있음. 따라서, 이대로 진행하게 되면 "Device is Jailbroken"이 출력되는 것이므로 w0 레지스터의 값을 0으로 변경

 

이제, c명령어로 모든 process 를 resume시키게 되면 "Device is Not Jailbroken" 알람창이 뜨는 것을 확인 가능

 

※ 참고

https://www.citadel.sh/blog/dvia-v2-jailbreak-detection-solutions

 

반응형

'Information Security > iOS' 카테고리의 다른 글

Frida iOS Method Trace  (1) 2020.07.09
Clutch(iOS 12.4)  (2) 2020.07.08
lldb 디버깅 환경 구축(iOS 12.4)  (0) 2020.06.27
appinst 트윅 이용한 IPA 파일 설치  (5) 2020.05.31
iOS 13.4.1 탈옥 - CheckRa1n + BootRa1n  (1) 2020.05.30

+ Recent posts