2번 문제는 chall02 메서드를 실행시켜야 한다.
chall02 메서드 검색 결과, chall02 메서드를 호출하는 코드가 존재하지 않는 것으로 추측된다.
파이썬 코드는 아래와 같다.
import frida
import sys
jscode = """
setImmediate(() => {
Java.perform(function() {
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch : function(instance) {
console.log("onMatch: " + instance);
instance.chall02();
},
onComplete : function() {
console.log("onComplete");
}
});
});
})
"""
process = frida.get_usb_device().attach("FridaLab")
script = process.create_script(jscode)
script.load()
sys.stdin.read()
파이썬 코드를 보면 2번 문제에서는 Java.use() 함수 대신 Java.choose() 함수를 사용하였다.
Java.use() 함수는 Java 클래스에 접근할 수 있어 클래스의 메서드를 오버라이딩하거나 속성 값을 변경할 수 있다.
1번 문제의 chall01 변수와 getCahll01Int 메서드는 static 키워드를 사용해 클래스에서 직접 접근이 가능한 변수와 메서드이다. 그래서 use() 함수로 challenge 01 클래스의 인스턴스를 생성한 뒤, chall01 변수 값을 변경하거나 getChall01Int 메서드를 오버라이딩 할 수 있던 것이다.
그러나 2번 문제의 chall02 메서드는 static 키워드를 사용하지 않는 인스턴스 메서드이다. 자바에서 인스턴스 메서드와 일반적으로 사용하는 변수(static 키워드를 사용하지 않는 인스턴스 변수를 의미함)들은 클래스에서 직접 접근이 불가능하며 객체 즉, 인스턴스에서만 접근할 수 있다.
그래서 2번 문제는 현재 메모리에서 특정 클래스의 모든 인스턴스를 검색하는 choose() 함수를 사용해야만 문제를 풀 수 있다.
파이썬 코드를 다시 보자.
fridalab의 MainActivity 인스턴스를 onMatch 키워드로 매칭하면 해당 인스턴스를 출력한다.
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch : function(instance) {
console.log("onMatch: " + instance);
instance.chall02();
},
onComplete : function() {
console.log("onComplete");
}
그 다음에 MainActivity 인스턴스에서 chall02 메서드를 실행, onMatch가 끝나면 onComlete 키워드로 onComplete 출력 후 choose() 함수를 종료한다.
chall02 메서드가 실행되어 2번 문제를 해결하였다.