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 |