ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Frida] Uncrackable level 1 풀이
    Learning/Android 2023. 12. 18. 13:57

    owasp에서 만든 apk 문제이다

     

     

    우선 앱을 들어가면 루팅이 탐지되어 앱이 종료된다.

     

    MainActivity.onCreate

    메인 액티비티의 onCreate 함수를 보면 c.a(), c.b(), c.c()를 체크하여 루팅을 탐지하는 것으로 보인다.

    class c

    c 클래스를 보면 a 메서드에서는 su라는 파일이 있는지 체크, b메서드에서는 Build.TAGS에 test-keys라는 항목이 있는지 체크, c 메서드에서는 여러 루팅 관련 어플리케이션이 있는지 탐지한다.

     

    b메서드의 경우 루팅되어있을 경우에는 ro.build.tags=release-keys라는 값을 가지고 있고, 루팅이 되어있지 않다면 ro.build.tags=test-keys라는 값을 가지고 있다.

     

    결국 삼중으로 되어있는 루팅 체크를 우회해야한다.

     

    근데 정말정말 간단한 방법이 있다.

     

    MainActivity.a

    앱 종료 로직을 보면, OK버튼의 onClick 이벤트로 System.exit를 호출한다. System.exit을 호출하지 않도록 하면 루팅이 탐지되어도 앱 사용이 가능할 것이다.

     

    setImmediate(function() {
    	Java.perform(function() {
    		console.log("[*] Script start"); 
    		
    		let AnonymousClass1 = Java.use("sg.vantagepoint.uncrackable1.MainActivity$1");
    		AnonymousClass1["onClick"].implementation = function (dialogInterface, i) {
    			console.log("pass exit func");
    		};
    				
    		console.log("[*] Script finish");
    	});
    });

     해당 onClick 이벤트를 후킹하는 코드이다 한 번 테스트해보자

     

    루팅이 탐지되었지만

     

    OK버튼을 눌러도 exit 함수가 호출되지 않으면서 앱 사용이 가능하다. 이제 Secret string만 알아내면 된다.

     

    Mainactivity.verify

    이제 Secret String을 알아낼 차례다

    메인액티비티의 입력값 검증 코드이다

    a.a(obj)에서 true가 반환되면 비밀번호가 맞다고 판단되는 것 같다.

     

    a.a(obj)

    검증 로직이다! sg.vantagepoint.a.a.a(arg1, arg2)를 통해 bArr의 값을 만들어주고, 우리의 입력값과 같은지 확인하는 것을 볼 수 있다.

     

    sg.vantagepoint.a.a.a

    해당 코드이다. AES 복호화를 하는 것을 볼 수 있고, 앞서 넘겨준 두 인자는 복호화를 위한 값들인 것을 알 수 있다.

    근데 복호화를 하며 시간낭비하기 아까우니 해당 메서드를 후킹하며 반환값을 훔쳐오자

     

    setImmediate(function() {
    	Java.perform(function() {
    		console.log("[*] Script start"); 
    		
    		let AnonymousClass1 = Java.use("sg.vantagepoint.uncrackable1.MainActivity$1");
    		AnonymousClass1["onClick"].implementation = function (dialogInterface, i) {
    			console.log("pass exit func");
    		};
    		
    		let a = Java.use("sg.vantagepoint.a.a");
    		a["a"].implementation = function (bArr, bArr2) {
    			let result = this["a"](bArr, bArr2);
    			console.log(`a.a result=${result}`);
    			return result;
    		};
    				
    		console.log("[*] Script finish");
    	});
    });

    해보자!

    VERIFY버튼을 누르면 우리의 입력값은 틀렸다고 나오지만, 콘솔에 올바른 리턴값이 찍히는 것을 볼 수 있다.

     

    cyberchef

    cyberchef로 돌려보니 비밀번호는 "I want to believe"라는 것을 볼 수 있다. 

     

    1번 끝!

    'Learning > Android' 카테고리의 다른 글

    [Frida] Uncrackable 4 (r2pay) 풀이  (1) 2024.01.20
    [Frida] Uncrackable level 3 풀이  (0) 2023.12.29
    [Frida] Uncrackable level 2 풀이  (0) 2023.12.18
    [Frida] FridaLab 1~8 풀이  (1) 2023.12.16
    [Frida] 환경 세팅  (0) 2023.11.14

    댓글

Hi