이제 절반을 넘어 5번째 도전과제이다.

chall05()가 항상 "frida"문자열을 받도록 하여라...
언뜻 보면 4번 과제와 비슷해 보이지만 일단 코드를 보도록 하자

기본적으로 4번 문제에서와 같이 인스턴스 메서드 chall05에서 str.equals를 이용하여 frida 문자열을 확인하고 있다.
그런데 이번에는 한번이라도 다른값이 들어오면 바로 0을 반환하도록 되어있다.
그렇다면 한번은 4번과 같은 방법으로 푸는 꼼수는 통해도 다음 문제를 풀때 다시 빨간색으로 돌아오게 된다..
그렇다면 chall05()메서드가 항상 frida 문자열을 인자값으로 받아오려면 어떻게 해야할까??
이 문제에 대해서는 조금 고민을 해보아야만 했다.
Java.choose API 를 사용하였을때는 한번만 적용이 되는 것이기 때문에 패스하고 어떤것을 써야하나 검색을 하던 찰나에 this.(메서드)()API와 오버로딩 함수 문법을 알았다.
this.chall05() API를 사용하게 되면 기존의 chall05() 메서드의 행위를 하도록 만들면서 해당 인자 값에 우리가 원하는 문자열을 넣을 수 있다.
내부 로직은 정상적으로 하되 메서드가 실행될때 마다 frida 문자열이 인자로 들어가게 할수 있다는 것이다.
이때 인스턴스를 호출하는 것이 아닌 메서드를 재작성하는 것이기 때문에 Java.use API를 사용하도록 하겠다.
클래스 내에 같은 이름을 가진 매서드가 여러개 존재하고, 각 메서드 마다 다른 매개변수가 존재는 메서드를 정의하는 것으로 overload()함수에서는 overload("java.lang.String")으로 지정하면 첫번째 메서드가 호출되고overload("java.lang.String",int)로 지정하면 두번째 메서드가 지정된다.
MainActivity 클래스 에서는 chall05 메서드가 하나이므로 overload("java.lang.String")를 사용하도록 하겠다.
오버로드의 개념을 이용하면서 메서드를 재작성 하기 때문에 implementation 속성을 사용하고 문자열을 인자 값을 받기 때문에 function에 arg를 넣어준다.
그렇다면 최종 chall05.js의 코드는 이렇게 될것이다.
Java.perform(function(){
var Chall05 = Java.use("uk.rossmarks.fridalab.MainActivity")
Chall05.chall05.overload("java.lang.String").implementation = function(arg){
this.chall05("frida");
console.log("[+]이제 chall05에 항상 frida가 전달됩니다.")
}
})
이제 frida -U -l chall05.js FridaLab 명령어를 실행하고 에뮬레이터에서 check 버튼을 여러번 눌러보겠다.


프리다에서도 잘 전달이 되고 있고, 에뮬레이터의 앱에서도 정상적으로 계속 클리어 상태가 유지되고 있다!!
앞으로 세개 남은것도 아주 기대가 된다.
- 다음 포스트에 계속...