티스토리 뷰

반응형

http://damnvulnerableiosapp.com/

 

DVIA (Damn Vulnerable iOS App) | A vulnerable iOS app for pentesting

Downloads Swift Version (April, 2018) – Download the IPA file from here here Github – Here Make sure to read this for instructions on how to install the app on any device (jailbroken or not jailbroken), and how to compile the app with Xcode. This versi

damnvulnerableiosapp.com

에서 IPA 파일을 다운로드 받는다. 

 

 

3uTools를 사용해 해당 IPA를 iphone에 설치한다.

 

 

앱을 켜보면 이와같이 Jailbreak를 탐지할 수 있는 항목을 확인할 수 있다. Test 1, Test 2 를 누르면 탈옥됐다는 메세지가 뜬다. 이를 우회하는 것을 시도해 보는 과정을 보여준다.

 

 

 

IPA 파일은 기본적으로 ZIP 파일과 동일하기 때문에 확장자를 ZIP으로 변경하고 압축된 파일중에 Binary File을 찾는다. 보통 IPA이름과 동일하다.

 

 

이를 IDA에 올리면 정적으로 분석할 수 있게된다. 왼쪽에 Function Window에 보이는 것이 이 Binary에서 사용하는 클래스와 함수 목록이다. 

 

 

만만한 단어인 Jail을 검색해보면 jailbreakTest1Tapped: 함수와 jailbreakTest2Tapped: 함수를 통해 각각의 버튼 클릭에 대한 이벤트를 수행한다고 짐작할 수 있다.

 

 

jailbreakTest1Tapped: 함수를 보면 내부에서 isJailbroken함수를 호출하고, 그 반환 값을 showAlertForJailbreakTestIsJailbroken: 함수에게 전달한다는 것을 확인할 수 있다.

 

 

 

isJailbroken에 대해서 살펴보니 우선 NSFileManager.defaultManager() 이 반환하는 객체를 통해서 총 5개의 파일이 존재하는지 확인하고, 하나라도 존재한다면 탈옥됐다고 판단하여 0x01을 반환하게 된다.

 

 

 

이후에 "This is a test.".writeToFile("/private/jailbreak.txt", 1, 4, &25) 를 통해서 해당 경로에 이 문자열을 쓰게 된다. /private는 시스템 레벨의 디렉토리며 여기에 접근하기 위해서는 root 권한이 필요하다. 정상적으로 작성이 되었다는 것은 탈옥이 되어 있는 디바이스라는 뜻이기 때문에 0x01을 반환하고 모두 해당되지 않는다면 0x00을 반환한다.

 

Jailbreak Test1에 대해서는 이 부분의 반환값을 Hooking을 통해 변조하면 탈옥 탐지를 우회할 수 있다.

 

우선 Hooking할 함수를 정했다면 이 함수의 어느 Class에 위치하는지 확인해야 한다.

물론 IDA를 통해서 간단하게 확인할 수 있지만 frida를 통해서 정확한 함수명을 파악하는 것이 좋다.

 

 

클래스 JailbreakDetectionVC 에 존재하는 isJailbroken 함수이고, 멤버 함수로 구현되어있다. 그리고 이 함수를 호출할 때에는 별도의 매개변수가 필요하지 않다.

(이 정도 정보를 획득할 수 있다. 첫 번째 인자는 객체 자신, 두 번째 인자는 Selector가 들어간다. - 이게 Default)

 

를 통해서 클래스 명을 수집할 수 있지만 워낙 많은 양이 나오기 때문에 findstr을 파이프라인으로 적용해 찾아보면

 

이와 같이 찾을 수 있다. 

 

 

마찬가지로 위 소스로 해당 클래스의 함수들을 찾아보면

 

 

이와 같이 찾을 수 있다. 자세히 보면 함수명 앞 뒤에 특수문자들이 붙는데 이걸 반드시 포함하여 Frida 코드를 제작해야 한다. (이러한 부분에서 한번 Frida로 함수명을 출력해보는 것도 좋다.)

 

이제 - isJailbroken 함수의 반환값을 무조건 0x00으로 하도록 Hooking하는 코드를 짜본다.

 

 

위 코드를 실행하면 아래와 같이 멈춰있는다. 이제 - isJailbroken 함수를 호출하면 함수에 들어갈 때는 onEnter, 함수를 빠져나올 때는 onLeave를 거치게 된다.

(문법 자체는 Android랑 동일한 것 같다....?)

 

이제 앱에서 Jailbreak Test 1 버튼을 눌러보자.

 

 

반환될 때 onLeave에 들어와 retval이 정상적으로 0x00으로 수정되어 반환되는 것을 확인할 수 있다. 당연하게도 앱의 알림 창엔 "Device is Not Jailbroken" 이라는 문구를 확인할 수 있다.

 

이어서 - jailbreakTest2Tapped: 함수를 통해 탈옥 탐지를 하는 것을 우회해보도록 한다.

 

 

해당 함수를 살펴보면 - isJailbroken 함수의 내용이 직접 구현되어 있는 것을 확인할 수 있다. 그리고 추가로

 

 

추가로 이런 방식을 통해서도 탈옥탐지를 진행한다. 결과적으로 Test 1, Test 2 모두 DamnVulnerableAppUtilities 클래스에 존재하는 + showAlertForJailbreakTestIsJailbroken: 함수를 통해 결과를 판단한다.

 

그렇기 때문에 위 함수의 인자 값을 변조하게 되면 우리가 원하는 방향으로 프로그램 흐름을 변경할 수 있다.

 

 

우선 해당 함수를 살펴보면 bool a3 라는 한 개의 파라미터를 통해 함수를 호출하게 된다. 따라서 위 Frida 코드의 onEnter 부분을 통해 파라미터를 항상 0x00으로 변경하게 된다면 항상 "Device is Not Jailbroken"을 보여주게 될 것이다.

 

 

이와 같이 파라미터를 변조하고 명령어를 입력하게 되면 (파라미터 개념 자체에 대해서는 언급하지 않는다.)

 

그러면 이렇게 Jailbreak Test 1, 2를 클릭할 때마다 이와 같이 파라미터 값이 변조되고 "Device is Not Jailbroken" 문자열을 출력하게 된다.

 

물론 조금 더 우아한 방법을 사용할 수 있을 것이다. 그러나 IOS에 대해서 Frida를 처음 포스팅하는 것이기 때문에 가장 심플한 방법을 통해서 진행해봤다.

 

반응형

'IOS > FRIDA' 카테고리의 다른 글

[Frida-trace] Frida-trace 사용법.  (1) 2020.07.10
[FRIDUMP] Fridump를 이용한 Memory Dump 및 분석.  (0) 2020.07.08
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함