5번도 고민을 했던 과제긴 하였지만 6번 부터는 뭔가... 뭔가 다르다..

chall06()메서드가 10초 후에 알맞은 값으로 실행되게 하라고..?
이게 무슨말일까 일단 jadx로 가서 디컴파일시킨 자바 코드를 보도록 하자

마찬가지로 MainActivity 클래스에 chall06()메서드가 존재하는데 challenge_06클래스가 또 존재하는 것을 알 수 있다.
해당 클래스로 가서 코드를 보도록 하자.

challenge_06 클래스의 confirmChall06(i)메서드 값이 참일때 6번 과제는 해결되는듯 하다.
confirmChall06메서드의 내용을 보면 i가 chall06과 같으면서 메서드가 시작된지 startTime()이 10초가 지나면 참이 된다는 얘기다.
어허.... 이번엔 또 어떻게 해결을 해야할까..???
세가지에 대한 해결방법을 세워야 한다.
10초 후에 메서드가 실행되도록 하는 것엔 setTimeout(function, delay) API 방법을 사용하면 될 것 같다.
여러번의 시행착오 끝에 작성된 chall06.js의 코드는 다음과 같다.
setTimeout(function(){
console.log("[+]10초 후에 메서드가 실행됩니다.");
Java.perform(function(){
let chall_main;
Java.choose("uk.rossmarks.fridalab.MainActivity",{
onMatch : function(instance){
chall_main = instance;
const Chall06 = Java.use("uk.rossmarks.fridalab.challenge_06");
Chall06.confirmChall06.implementation=function(){
console.log("[+]chall06을 true를 반환하였습니다.");
return true;
}
chall_main.chall06(1);
},
onComplete : function(){}
});
})
},10000)
하... 이전에 하던거와 달리 엄청 길다..
설명하자면 setTimeout에서 10000ms 그러니까 10초의 딜레이를 걸어주고, MainActivity의 chall06메서드를 호출한다.
호출하여 해당 메서드에서 접근하는 challenge_06 클래스의 confirmChall06메서드를 true로 변환하여 주고 MainActivity의 chall06()메서드로 돌아와 1을 전달해 결과적으로 chall06()메서드가 참이 되도록 한다.
이제 이 코드를 frida -U -l chall06.js FridaLab 명령어로 실행시켜 보면

10초 후에 문구가 출력되면서 정상적으로 되었다고 나온다.
이제 에뮬레이터로 가서 확인하여 보면

앱에서도 정상적으로 통과된 것을 볼 수 있다.
(5번은 chall05.js 다시 해주면 불 켜진다...)
자. 해결방법이 한가지만 있는것이 아니었다.
우리가 사용한 것은 confirmChall06의 값을 true로 반환시키는 것이었지만 challenge_06코드를 보면 아래에 addChall06() 메서드가 있는 것을 볼 수 있다.

그리고 이는 MainActivity 클래스에서도 사용이 되는 것을 알 수 있는데

addChall06에서 계산된 값을 confirmChall06의 인자 값에 들어가게 되면 i와 chall06이 같아지게 되어있고, MainActivity의 chall06의 조건이 맞게 되면서 참을 반환하게 되는것이다.
이에 맞는 코드 chall06_02.js는 다음과 같다.
setTimeout(function(){
console.log("[+]10초 후에 메서드가 실행됩니다.")
Java.perform(function(){
var Chall06 = Java.use("uk.rossmarks.fridalab.challenge_06");
Chall06.addChall06.overload("int").implementation = function(arg){
console.log("후킹 시작.")
Java.choose("uk.rossmarks.fridalab.MainActivity",{
onMatch : function(instance){
instance.chall06(Chall06.chall06.value);
console.log("[+]chall06 메서드 일체화 성공.")
},
onComplete : function(){
console.log("[+]chall06의 값이 true가 되었습니다.")
}
})
}
})
},10000)
위의 코드에서 메서드가 실행될때 challenge_06클래스의 addChall06메서드의 내용을 재작성 하고 MainActivity를 찾아 인스턴스를 매칭시켜 재작성한 addChall06메서드와 chall06 메서드를 일치 시키고, 결과적으로는 MainActivity의 chall06메서드에서도 true가 반환되도록 한다.

실행을 하면 다음과 같이 나오게 된다.
후... 두가지 풀이나 있을줄은 몰랐다... 새롭고 재미있다!!
이제 겨우 남은 것은 두문제이다.
얼마나 어려울지 벌써 두렵지만 이 고민하는 과정이 너무 즐거워서 기대된다.
- 다음 포스트에 계속...