[iOS][Frida] Bypass Frida Path Checking

silver35·2022년 7월 7일
0

iOS

목록 보기
1/3

소스코드 분석

앱을 실행 후 Frida file check 버튼을 누르면 아래와 같이 Frida detected = true라는 알림창이 뜬다.

xcode로 build된 파일을 열어서 swift_source/YDFridaVC.swift 소스코드를 보면, 버튼 클릭 시 YDFridaDectection.checkIfFridaInstalled() 함수를 호출해 그 결과를 result 변수에 저장한 후 alert창으로 출력하고 있음을 알 수 있다.

checkIfFridaInstalled 함수를 분석해보면 /usr/sbin/frida-server가 존재하는지 검사한다.
즉, checkResourceIsReachableAndRetrunError를 통해 파일의 존재 여부를 검사하며 access 함수를 통해 파일에 접근할 수 있는지 검사해서 파일에 접근가능하면 0을 리턴하고 실패하면 -1을 반환한다.

스크립트 작성

(1) 첫번째 방법 : NSURL 클래스의 checkResourceIsReachableAndRetrunError 함수를 후킹해 onLeave 콜백 함수에서 반환값을 0으로 변경한 후, access 함수를 후킹해 onLeave 콜백 함수에서 반환값을 -1로 변경

function modifyNSURLRet(){
    var hook = ObjC.classes.NSURL['- checkResourceIsReachableAndReturnError:']
    Interceptor.attach(hook.implementation,{

        onLeave(retval){
            retval.replace(0);
        }
    });
}

function accessRet(){
    var access = Module.findExportByName(null,"access");
    Interceptor.attach(access,{
        onLeave(retval){
            retval.replace(-1);
        }
    });
}
console.log("[*]going silver!!!");
modifyNSURLRet();
accessRet();

코드설명 :
Objc.classes : Objective-C의 클래스 정보를 모두 반환한다.
→ 코드에서 NSURL이름의 Objective-C의 클래스를 찾고 checkResourceIsReachableAndReturnError 함수를 찾아 hook 변수에 저장한다.
→ Objective-C에서는 함수에 + 또는 - 특수문자를 붙이는데 ‘+’는 클래스의 함수를 의미하며 ‘-’는 인스턴스의 함수를 의미한다.
Interceptor.attach(target,callback) : target 함수를 호출하면 등록한 콜백에 따라 임의의 코드를 실행하며 target에는 함수의 주소값이 들어간다.
Module.findExportByName(moduleName|null, exportName) : 모듈은 프로세스의 주소를 알아내는 용도로 사용하는 객체로 외부 함수의 주소를 가져온다.
→ access라는 이름의 외부함수의 주소값을 저장하며 리턴값을 -1로 바꾼다.

(2) 두번째 방법 : YDFridaDetection 클래스의 + checkIfFridaInstalled 함수 주소를 알아내 후킹해 onLeave 콜백함수에서 반환값을 0으로 변경

function checkRet(){

    var classname = "YDFridaDetection";
    var funcName = "+ checkIfFridaInstalled"; 
    var hook = eval('ObjC.classes.'+ classname+ '["' + funcName +'"]');

    console.log(hook.implementation);

    Interceptor.attach(hook.implementation, {  
    
        onLeave:function(retValue){
            retValue.replace(0);
        }

    }
)
}
console.log("[*]going silver!!!");
checkRet();

코드설명 : eval(string) : 문자로된 자바스크립트를 실행하는 함수

참고사항) 파일을 살펴보면 Swift는 .swift 파일 하나로 구성되어 있지만 Objective - C는 Header 파일(.h) 와 Implementaion(.m) 파일이 존재함을 알 수 있다. 스크립트를 작성하는 방법은 두가지가 있다.

실행 결과

frida -U -F -l bypass_checkFridaInstalled.js : -F은 포그라운드 프로세스에 frida를 연결하는 것이며 -l로 bypass_checkFridaInstalled.js 로드한다.

스크립트 실행 후 Firda file check 버튼을 누르면 true → false로 바뀐것을 확인 할 수 있다.

분석을 마치며

iOS 앱을 IDA를 분석하는 것이 소스코드를 보면서 분석을 하니 앱의 작동 원리에 대해 더 잘 이해할 수 있었다. 또한, Frida 코드 작성시 애매하게 알고 있었던 Frida의 명령어에 대해 깊게 이해할 수 있는 시간이였다.

참고자료)
https://github.com/rustymagnet3000/ios_debugger_challenge
https://dreamhack.io/?obj=150
Objective-C VS Swift 어떤 차이가 있을까??

0개의 댓글