setImmediate(function() {
Java.perform(function() {
function hook(){
var challenge07 = Java.use("uk.rossmarks.fridalab.challenge_07");
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch: function(instance) {
console.log("Bruteforce Start ! : " + instance);
// bruteforce 로직
while(true) {
var random = String(Math.floor(Math.random() * 9000) + 1000);
console.log("bruteforce chall07.value : " + random);
if (challenge07.check07Pin(random)) {
instance.chall07(random);
break;
} else {
console.log("original chall07.value : " + challenge07.chall07.value);
}
}
},
onComplete: function() {
console.log("Completed");
clearInterval(timerId); // setInterval 종료
}
});
}
var timerId = setInterval(hook, 10000); // 타이머 ID 저장 및 주기적으로 hookInstance 실행 (예: 1초 간격)
}); // Java.perform 중괄호 닫기
}); // setImmediate 괄호 닫기
chall07.value 변수는 static 변수임
그래서 브루트 포싱으로 변수 값을 찾아내는 방법 대신 변수 값을 변조,
변조한 값으로 메소드를 호출해서도 문제를 해결할 수 있음
setImmediate(() => {
Java.perform(function() {
function hookInstance() {
var challenge07 = Java.use("uk.rossmarks.fridalab.challenge_07");
challenge07.chall07.value = "1"; // static 필드 수정
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch: function(instance) {
console.log(instance);
instance.chall07("1"); // MainActivity의 chall07 호출
},
onComplete: function() {
console.log("Completed");
}
}); // Java.choose 중괄호 닫기
} // hookInstance 중괄호 닫기
hookInstance(); // 함수 호출
}); // Java.perform 중괄호 닫기
}); // setImmediate 괄호 닫기