끄적끄적

[Frida] FridaLab 본문

Security/Mobile

[Frida] FridaLab

Go0G 2021. 10. 17. 18:03

사용 도구

NOX
JADX
Frida

실행중인 앱의 패키지명을 확인하고 싶은 경우 "adb shell"로 접속 후 "ps | grep [app_name]" 명령어로 확인하자

FridaLab 패키지명: uk.rossmarks.fridalab


Challenge_01

클래스내 변수 값을 변경

setImmediate(function(){
    Java.perform(function(){
        console.log("[+] Change Class challenge_01's variable 'chall01' to:1");
        var target = Java.use("uk.rossmarks.fridalab.challenge_01"); //클래스 위치 설정
            target.chall01.value = 1; //클래스 내 변수 값을 설정
      })
});

Challenge_02

클래스 내 특정 instance 메소드 호출

Java.choose() 사용

setImmediate(function(){
      Java.perform(function(){
          console.log("[+] Run chall02()");

          Java.choose("uk.rossmarks.fridalab.MainActivity",
          {
              "onMatch":function(Call_callange_2){
                  Call_callange_2.chall02(); 
          },
              "onComplete" : function(){
                  console.log("[+] Complete");
          }
      })
  })
});

Java.use() 사용

setImmediate(function(){
    Java.perform(function(){
        console.log("[+] Run chall02()");
        var target = Java.use("uk.rossmarks.fridalab.MainActivity");
        target.chall05.implementation = function(arg){
            this.chall02();
        }
    })
});

 

static 메소드를 호출: Java.use()
instance 메소드를 호출: Java.choose()

Challenge_03

Java.use()함수와 implementation을 사용하여 함수 로직 변경

setImmediate(function(){
    Java.perform(function(){
        console.log("[+] Make Chall03() return true");
        var target = Java.use("uk.rossmarks.fridalab.MainActivity");
        target.chall03.implementation = function(){ //chall03은 메소드
            return true
        }
    })
});

 


Challenge_04

Java.choose() 사용하여 매개변수 할당 로직을 변경(인스턴스 메소드를 호출)

setImmediate(function(){
    Java.perform(function(){
        console.log("[+] Send \'frida\' to chall04()");
        
        Java.choose("uk.rossmarks.fridalab.MainActivity",{
            "onMatch":function(Call_callange_4){
                Call_callange_4.chall04("frida"); 
        },
        "onComplete" : function(){
            console.log("[+] Complete");
        }
    } 
    )})
});

Challenge_05

chall05() 메소드를 호출할 때 마다 "frida" 매개변수 전달

setImmediate(function(){
    Java.perform(function(){
        console.log("[+] Always send \'frida\' to chall05()");
        var target = Java.use("uk.rossmarks.fridalab.MainActivity");
        target.chall05.implementation = function(arg){
            this.chall05("frida");
        }
    })
});
다른 동일한 이름의 chall05() 메소드가 존재할 경우 "java.lang.String"을 오버로딩할 수 있음

Challenge_06 ★

Chall06_class 변수에 challenge_06 클래스 저장 후 해당 클래스에 있는 addChall06() 메소드를 재작성

addChall06() 메소드는 MainActivity 클래스내에서 호출할 때 chall06 값을 결정하므로 해당 클래스의 인스턴스를 가져와 정답을 체크하는 chall06() 메소드를 호출

이때 addChall06() 메소드를 호출하면서 challenge_06 클래스에 정의된 chall06 변수의 값을 인자로 전달

setTimeout(function() {
    setImmediate(function(){
        Java.perform(function(){
            console.log("[+] Run chall06() after 10 seconds with correct value");
            console.log("[+] Hooking challenge_06 Method");
            var Chall06_class = Java.use("uk.rossmarks.fridalab.challenge_06"); //challenge_06 클래스에 후킹
            Chall06_class.addChall06.implementation = function(arg){ //addChall06 호출 시점으로 설정

                Java.choose("uk.rossmarks.fridalab.MainActivity", 
                {
                    "onMatch":function(instance){ //메인 엑티비티 클래스를 인스턴스로 설정
                        instance.chall06(Chall06_class.chall06.value); //challenge_06 내의 chall06 변수를 chall06() 인스턴스의 매개변수로 전달
                        console.log("[*] value: "+ Chall06_class.chall06.value);
                    },
                    "onComplete":function(){
                        console.log("[+] Hooking Complete")
                    }
                }
                )

            }
        })
    });
    console.log("[+] RunTime 10 Seconds ... ");
}, 10000);

Challenge_07 ★

무작위 대입 공격을 통해 랜덤한 값을 찾기

setImmediate(function(){
    Java.perform(function(){
        console.log("[+] Bruteforce check07Pin() then confirm with chall07()");
        var target = Java.use("uk.rossmarks.fridalab.challenge_07");
        Java.choose("uk.rossmarks.fridalab.MainActivity",
        {
            "onMatch":function(instance)
            {
                for(var i=1000;i<=9000;i++)
                {
                    var str_i = String(i);
                    if(target.check07Pin(str_i)) //challenge_07 클래스의 check07Pin() 메소드를 사용하여 값 일치 여부 확인
                    {
                        instance.chall07(str_i); //메인 엑티비티의 chall07() 메소드 호출
                        break;
                    }
                }
            },
            "onComplete":function()
            {
                console.log("[+] Complete");
            }
        })
    })
});

Challenge_08 ★★

안드로이드 내장 클래스 후킹하기

setImmediate(function(){
    Java.perform(function(){
        console.log("[+] Change \'check\' button\'s text value to \'Confirm\'");
        var target = Java.use("android.widget.Button");
        Java.choose("uk.rossmarks.fridalab.MainActivity",
        {
            "onMatch":function(instance)
            {
                var checkId = instance.findViewById(2131165231); //check의 정수 값
                var check = Java.cast(checkId, klass); //"Button"으로 형변환
                var string = Java.use("java.lang.String");
                check.setText(string.$new("Confirm")); //인스턴스 생성
            },
            "onComplete":function()
            {
                console.log("[+] Complete");
            }
        })
    })
});
Java.cast(handle, klass): handle에 전달된 인스턴스를 klass의 클래스로 캐스팅(형변환)하는 함수

Reference

 

'Security > Mobile' 카테고리의 다른 글

[Frida] Useful Code  (0) 2021.10.20
[Frida] 기본 문법  (0) 2021.10.18
[Frida] Hooking Code Sample(Python)  (0) 2021.10.17
[Android analysis] Android Dalvik Opcode(Smali Code)  (0) 2021.09.12
[Android analysis] 디컴파일 및 리패키징  (0) 2021.09.12
Comments