문제는 다음과 같다.
Run chall02()
즉, chall02라는 함수를 실행해야 한다.
jadx를 이용해서 FridaLab.apk를 다시 살펴보자.

MainActivity 클래스에 chall02()가 존재한다.

chall02를 자세히 살펴보면 위와 같은 함수임을 알 수 있다.
그러면 MainActivity 클래스에서 chall02()를 찾아 실행해주는 후킹코드를 작성하면 된다.
Java.perform(function (){
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch: function(instance){
console.log("Matched class: " + instance.toString());
instance.chall02();
console.log("Called chall02 method");
},
onComplete: function(){
console.log("Class hooking complete.");
}
});
})


굳.
문제는 다음과 같다.
Make chall03() return true
chall03함수를 true를 리턴하도록 만드는 것이다.

chall03()을 살펴보면 이는 return false를 하는 함수임을 알 수 있다.
chall03함수를 찾아서 리턴값을 변경하는 식으로 코드를 작성해주면 될 것 같다.
Java.perform(function (){
var MainActivity = Java.use("uk.rossmarks.fridalab.MainActivity");
var chall03 = MainActivity.chall03;
chall03.implementation = function() {
console.log("chall03() method called");
var ret = chall03.call(this);
console.log("Original chall03() returned: " + ret);
var newRet = true;
console.log("Modifying return value to: " + newRet);
return newRet;
};
});
위 js코드로 후킹을 진행해주면 아래와 같이 잘 후킹됨을 확인할 수 있다.


굳.
문제는 다음과 같다.
Send "frida" to chall04()
chall04()의 코드는 다음과 같다.

파라미터로 넘어가는 값이 frida 이면 complete가 뜬다.
Java.perform(function (){
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch: function(instance){
console.log("Matched class: " + instance.toString());
instance.chall04("frida");
console.log("Called chall04 method with argument 'frida'");
},
onComplete: function(){
console.log("Class hooking complete.");
}
});
})
2번 문제를 풀때 작성한 코드를 활용하여 후킹코드를 작성하였다.


문제는 다음과 같다.
Always sned "frida" to chall05()

chall05 코드를 보면 chall04와 크게 다를바 없어 보인다.
하지만, 다르다.
chall04는 frida가 들어와 값을 completeArr 값을 바꾼다음 frida가 아닌 값이 들어왔을때 값을 바꾸는 구간이 없지만, chall05에는 else 문에 해당 구간이 존재한다.
이게 문제가 되는 이유는 하단의 사진과 같이 check 버튼을 눌렀을 때 "notfrida"로 해서 chall05를 호출하는 구간이 있기 때문이다.

chall04의 방식으로 코드를 작성하면 처음에 스크립트로 chall05("frida") 호출했을 때는 성공하겠지만 확인을 위해 앱의 버튼 클릭 버튼 내부 로직에서 chall05("notfrida!") 호출해 실패 로직 발동 결과적으로 화면에는 여전히 실패일 것이다.
따라서 3번 문제와 같이 원래 인자가 무엇이든 무시하고 강제로 인자를 "frida"로 변조하고, 변조된 인자로 원본 함수를 실행시키는 방법을 이용해야 한다.
Java.perform(function (){
var MainActivity = Java.use("uk.rossmarks.fridalab.MainActivity");
var chall05 = MainActivity.chall05;
chall05.implementation = function(arg) {
console.log("chall05() method called with arg: " + arg);
var ret = chall05.call(this, "frida");
console.log("Original chall05() returned: " + ret);
return ret;
};
});


굳.