[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
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 |