[목차]

 

 

 

1. DVIA - Jailbreak Test 2

2. 스크립트 참고

3. 대응방안

 

 

 

 

 

1. DVIA - Jailbreak Test 2

 

# 작업 절차

: Objective-C로 작성된 클래스 메소드를 프리다로

1) 클래스 추출

2) 메소드 추출

3) 반환 값 확인 후 변조

 

 

 

1) Test 2 클릭 시 탈옥 탐지 팝업 확인

 

 

2) 프리다로 실행중인 앱의

- 프로세스 아이디 (PID)

- 앱 이름(번들 ID)

- 식별자 확인

$ frida-ps -Ua   //ps=process, -U=USB 연결된 디바이스, a=application info >> 현재 실행중인 앱 확인
 

 

다음으로 현재 실행 중인 앱에

로드 되어있는 class들을 확인해본다.

 

 

 

3) 코드 작성

3-1) 전체 class 호출 후

탈옥 탐지 class 찾기 위한 코드!

if(ObjC.available){     // 해당 코드가 실행 가능한 환경이라면,
	for(var classname in ObjC.classes) // ObjC.classes > 메모리에 올라와 있는 오브젝트 맵핑 클래스 모두 픽!
		console.log(classname)
}
 

 

프리다로 파일 로드 후 살펴본다.

방법 1. 키워드 검색
$ frida -U -l "c:\somewhere\jailBreak_test2.js" DVIA-v2 | find "Jail"  // 대소문자 구분함!

방법 2. 검색된 클래스들 모두 파일에 저장 후 메모장에서 검색
$ frida -U -l "c:\somewhere\jailBreak_test2.js" DVIA-v2 > classes.txt
 

 

둘 다 돌려보면

또는

 

> JailbreakDetection 클래스 존재 확인!

 

 

3-2) 해당 클래스의 메소드 확인 코드

if(ObjC.available){
	var classname = "JailbreakDetection"
    var methods = ObjC.classes[classname].$ownMethods
    // ObjC.classes[classname] = JailbreakDetection 클래스에 대한 정보를 가져온 뒤 
    // .$ownMethods 속성을 줌으로 JailbreakDetection의 메소드 정보가 해당 메소드에 들어간다.

	console.log(methods)
}
 

 

돌려보면

 

JailbreakDetection이라는 클래스가 사용하는

메소드는 "isJailbreken" 하나뿐인 것을 확인!

 

[참고] 메소드 앞에 + 기호가 붙는 경우는

해당 메소드가 클래스에 대한 메소드인 경우고

- 기호가 붙는 경우는 인스턴스의 메소드의 경우!

 

 

 

3-3) 찾은 메소드 반환 값 확인 코드

if(ObjC.available){
	var classname = "JailbreakDetection"             // 찾은 클래스 이름
	var methodname = "isJailbroken"                  // 찾은 메소드 이름
	var hook = ObjC.classes[classname][methodname]     // 찾은 클래스, 메소드에 대한 정보를 hook 변수에 담았다
	
    // 찾은 메소드에 대해서 Interceptor를 걸어 반환값을 확인해본다 
	Interceptor.attach(hook.implementation,{     // implementation 하는 이유는 해당 메소드를 실행하기 위함!
		onLeave:function(retval){                // 반환값 확인할 때는 onLeave! onEnter는 콜백!
                                                 // retval = return value  
                                                 // onLeave:function(retval) = 기본 구문!
			console.log("[+] Class Name: "+ classname)
			console.log("[+] Method Name: "+ methodname)
			console.log("[+] Type of return value: "+ hook.returnType) // 반환 값의 data type 확인!
			console.log("[+] Return Value: "+ retval)
            console.log("[+] 클래스 명: "+ classname)
			console.log("[+] 메소드 명: "+ methodname)
			console.log("[+] 데이터 타입: "+ hook.returnType)
			console.log("[+] 리턴 값: "+ retval)
		}
	})        // 코드 작성 시 괄호 주의;;
}
 

 

로드하면 아무것도 안 뜨지만

 

앱에서 test2 한번 눌러주면

 

 

정상 적으로 정보가 출력되고

리턴 값을 0으로 변조해 주면

탈옥 탐지 우회가 가능하겠다.

 

 

 

3-4) 탈옥 탐지 우회 최종 코드

if(ObjC.available){
	var classname = "JailbreakDetection"
	var methodname = "isJailbroken"
	var hook = ObjC.classes[classname][methodname]
	
	Interceptor.attach(hook.implementation,{
		onLeave:function(retval){
			console.log("[+] 클래스 명: "+ classname)
			console.log("[+] 메소드 명: "+ methodname)
			console.log("[+] 데이터 타입: "+ hook.returnType)
			console.log("[+] 리턴 값: "+ retval)
              
            var new_retval = ptr("0x0") // 16진수 0으로 작성을 한 뒤, 해당 값을 native pointer 형식으로 생성을 해야
                                        // 메모리에서 정상적으로 불러들여 사용이 가능
            retval.replace(new_retval)  // 기존 retval 값을 새 값으로 바꿔주고
			console.log("[+] 새 리턴 값: "+ retval) // 출력해본다.
		}
	})
}
 

돌려보면

정상 변조되어

탈옥 탐지 우회 성공!

 

 

 

 

 

2. 스크립트 참고

 

기본 프리다 스크립트는

구글링을 통해 쉽게 확인이

가능하며 일부 유용한 스크립트

샘플을 확인해 본다.

 

출처 :

https://github.com/interference-security/frida-scripts/tree/master/iOS

 

 

2-1) Find_classes.js

//Twitter: https://twitter.com/xploresec
//GitHub: https://github.com/interference-security
function run_show_classes_of_app()
{
    console.log("[*] Started: Find Classes")
    var count = 0
    for (var className in ObjC.classes)
    {
        if (ObjC.classes.hasOwnProperty(className))
        {
            console.log(className);
            count = count + 1
        }
    }
    console.log("\n[*] Classes found: " + count);
    console.log("[*] Completed: Find Classes")
}

function show_classes_of_app()
{
	setImmediate(run_show_classes_of_app) // setImmediate은 단말기와 프리다의 연결 타임아웃을 방지해주는 메소드
}

show_classes_of_app()
 

 

 

2-2) 반환값 수정.js

//Twitter: https://twitter.com/xploresec
//GitHub: https://github.com/interference-security
function show_modify_function_args(className, funcName)
{
  var hook = ObjC.classes[className][funcName];
  Interceptor.attach(hook.implementation, {
    onEnter: function(args) {
      // args[0] is self
      // args[1] is selector (SEL "sendMessageWithText:")
      // args[2] holds the first function argument, an NSString
      console.log("\n[*] Detected call to: " + className + " -> " + funcName);
      console.log("\t[-] Argument Value: "+args[2]);
      //your new argument value here
      var newargval = ptr("0x0")
      args[2] = newargval
      console.log("\t[-] New Argument Value: " + args[2])
    }
  });
}

//Your class name and function name here
show_modify_function_args("className", "funcName")
 
 
 
 
 

 

 

 

3. 대응방안

 

 

 

 

 

 

 

 


 

 

[도움 및 일부 이미지출처]

: 보안프로젝트 김태영 팀장 iOS 모바일 앱 모의해킹(기초) 강의

 

728x90

+ Recent posts