문제는 다음과 같다.
Run chall06() after 10 seconds with correct value
먼저 MainActivity에 있는 chall06 함수를 살펴보자.

challenge_06.confirmChall06(i)이 참이어야 complete로 바뀐다.

이는 challenge_06 클래스의 코드이다.
confirmChall06함수를 보면 chall06 변수의 값과 i가 같으면서 10초 이상 지났어야만 return true를 해준다.

상단의 코드는 MainActivity에서 onCreate부분에 해당하는 코드이다.
자세히 보면 50이하의 자연수를 생성해서 1초마다 넘겨주고 있음을 확인할 수 있다.
MainActivity에서 chall06을 호출해서 challenge_06 클래스의 chall06값을 인자로 넘겨 confirmChall06 조건을 강제로 만족시키게 하는 방식으로 코드를 작성하면 된다.
Java.perform(function(){
var challenge_06 = Java.use("uk.rossmarks.fridalab.challenge_06");
var secretVal = challenge_06.chall06.value;
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch: function(instance){
console.log("Matched class: " + instance.toString());
var ret = instance.chall06(secretVal);
console.log("Called chall06 method with secretVal, returned: " + ret);
},
onComplete: function(){
console.log("Class hooking complete.");
}
});
})
이와 같이 하면 10초 조건도 잘 우회가 된다.


6번을 해결하고 나면 5번이 미해결로 바뀌는 것을 확인할 수 있다. check를 눌렀기 때문이다. 이는 5번에서 풀었던 코드를 이용해 다시 후킹을 해줘야 한다.
굳.
문제는 다음과 같다.
Bruteforce check07Pin() then confirm with chall07()
chall07에 대해 알아보자.

chall07로 넘어온 인자에 str에 대해서 check07Pin을 하여 complete를 확인한다.

challenge_07 클래서에서는 setChall07()을 이용해 랜덤한 4자리 숫자의 PIN을 생성하고 check07Pin을 이용해서 이 값에 대한 검증을 한다.

setChall07()은 MainActivity의 onCreate에서 실행된다. 즉, 화면이 켜지면 pin번호는 변하지 않는다. check07Pin()을 브루트포스를 해서 pin 번호를 구할 수 있을 것 같다.
setImmediate(function(){
Java.perform(function(){
var challenge_07 = Java.use("uk.rossmarks.fridalab.challenge_07");
for (var i = 1000; i < 10000; i++){
console.log("Checking PIN: " + i);
if(challenge_07.check07Pin(i.toString())){
Java.choose("uk.rossmarks.fridalab.MainActivity",{
onMatch: function(instance){
instance.chall07(String(i));
console.log("Success PIN: " + i);
},
onComplete: function(){
console.log("Challenge 7 clear!");
}
});
break;
}
}
});
});


굳.
문제는 다음과 같다.
Change 'check' button's text value to 'Confirm'

chall08 메서드의 코드를 보면 R.id.check와 비교를 한다.
이게 원래 check가 있던 버튼일 것이라고 추정할 수 있다.

이 값을 후킹해서 Confirm으로 바꾸면 될 듯하다.
Java.perform(function(){
Java.choose("uk.rossmarks.fridalab.MainActivity",{
onMatch: function(instance){
var R = Java.use("uk.rossmarks.fridalab.R$id");
var checkBtnId = R.check.value;
var btn = instance.findViewById(checkBtnId);
var checkBtn = Java.cast(btn, Java.use("android.widget.Button"));
var string = Java.use("java.lang.String");
checkBtn.setText(string.$new("Confirm"));
},
onComplete: function(){
console.log("Challenge 8 modification complete.");
}
});
});
btn 변수는 android.widget.Button 클래스를 이용해 캐스팅을 해줘야 한다. 그리고 해당 버튼의 텍스트를 Confirm으로 바꿔주면 된다.


굳.