본문 바로가기

40./42. iOS

[DVIA] 02. Jailbreak Detection

[DVIA] 02. Jailbreak Detection


iOS 탈옥(iOS jailbreaking)은 iOS의 제한을 풀어 사용자의 루트에 접근할 수 있게 함으로써 서명되지 않은 코드를 실행할 수 있게 하는 과정을 말한다. 보안 상으 문제로 탈옥을 탐지하도록 되어있으며 DVIA를 이용하여 탈옥 탐지 우회를 시도 할 것이다.

※ 탈옥을 하는 이유 중 하나는 앱플과 앱 스토어가 막아 놓은 컨텐츠에 접근성 때문에 탈옥합니다. 



021. Jailbreak Test 1 (GDB)


DVIA 모바일 앱에서 Jailbreak Detection을 메뉴를 선택한 후 "Jailbreak Test 1"을 확인하면 탈옥 탐지를 확인하는 "Device is Jailbreken" 경고 메시지를 확인 할 수 있다.


# 진행단계 #

1. 테스트 실행(탐지)

2. Class 정보 획득

3. GDB 사용 (Break Point 설정)

4. Jailbreak Test 클릭

5. Break Point로 인하여 일시 정지

6. 탈옥 탐지 후 리턴 정보 수정

7. RUN


Class-dump-z를 이용하여 실행 중인 DVIA의 Class 정보를 획득한다.

~ # ps -ef | grep "Damn"

~ # class-dump-z /var/mobile/Application/[DVIA 설치 ]/DamnVulnerableIOSApp.app/DamnVulnerableIOSApp > DVIA.classdum.txt


텍스트 파일로 저장한 DVIA class 정보를 분석하여 - (void) jailbreakTest1Tapped: (id) tapped; 변수에서 탈옥 탐지 여부에 대한 정보를 저장하는 것을 확인 가능하다.


GNU 소프트웨어 시스템을 위한 기본 디버거인 GDB를 이용하여 실행 중인 DVIA에 attach 한다. 

~ # gdb

(gdb) attach [DVIA 앱 이름].PID



이전에 Class-dump-z에서 확인한 jailbreakTest1Tapped에 중단점을 걸어둡니다.

(gdb) b jailbreakTest1Tapped:


(gdb) c


(gdb) c

계속 진행하다보면 BreakPoint에 걸린 주소 위치가 출력이 됩니다.


disassemble 명령어를 이용하여 어셈블리 코드를 확인합니다.

(gdb) disassemble

blx는 링크 포함 분기 및 교환 명령어 세트 정보를 담고 있으며, 이전에 경고 메시지를 출력한 Object_msgSend를 호출할 때도 이용하기 때문에 모든 blx 주소를 저장하여 중단점을 걸어둡니다.


 참조 : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ik/Cihfddaf.html


(gdb) b *주소


(gdb) c

(gdb) x/s $r1

레지스트리 $r1에 저장된 변수를 확인하며, Class-dump-z에서 분석한 "showAlertForJilbreakTestIsJailbroken:"이 발견 될 때까지 진행합니다.


"showAlertForJilbreakTestIsJailbroken:"을 확인합니다.


(gdb) set $r2 = 0

(gdb) c

레지스트리 $r2에는 함수에서 탈옥 탐지를 수행하고 return 될 정보가 담겨있으며, 해당 정보를 0으로 세팅합니다.


DVIA 앱으로 돌아가면 탈옥 탐지가 우회한 "Device is Not Jailbroken" 메시지를 확인 가능합니다.


022. Jailbreak Test 2 (Cycript)


DVIA 모바일 앱에서 Jailbreak Detection을 메뉴를 선택한 후 "Jailbreak Test 2"을 확인하면 탈옥 탐지를 확인하는 "Device is Jailbreken" 경고 메시지를 확인 할 수 있다.


# 진행단계 #

1. 테스트 실행(탐지)

2. Class 정보 획득

3. Cycript 실행하여 변수 변경

4. RUN



Class-dump-z를 이용하여 실행 중인 DVIA의 Class 정보를 획득한다.

~ # ps -ef | grep "Damn"

~ # class-dump-z /var/mobile/Application/[DVIA 설치 ]/DamnVulnerableIOSApp.app/DamnVulnerableIOSApp > DVIA.classdum.txt

UIViewController Object 내 JailbreakDetectionVC 함수에서 탈옥 탐지하는 변수(- (BOOL) isJailbreaken;)을 확인합니다.


# cycript -p [PID]

cy# UIApp [UIViewController 접근]

cy# JailbreakDetectionVC.messages [JailbreakDetectionVC에서 사용하는 변수 주소 출력]


 참조 : http://www.cycript.org/


cy# JailbreakDetectionVC.messages['isJailbreaken'] = function () { return NO };


DVIA 앱으로 돌아가면 탈옥 탐지가 우회한 "Device is Not Jailbroken" 메시지를 확인 가능합니다.


 Cycript 단점 : GDB처럼 실행 시 동적으로 변수이 불가능합니다. 모바일 앱은 실행하되 메모리에 저장된 변수 정보를 변경하는 메모리 변조와 동일합니다




'40. > 42. iOS' 카테고리의 다른 글

[DVIA] 10. Binary Patching  (0) 2014.11.12
[DVIA] 03. Runtime Manipulation  (0) 2014.09.11
[DVIA] 01. Insecure Data Storage  (0) 2014.09.10
[iOS] Logify  (0) 2014.07.24
[DVIA] Damn Vulnerable iOS Application  (0) 2014.07.21