6. Run chall06() after 10 seconds with correct value
FridaLab 실습을 진행하도록 하겠습니다.
지난 실습에서는 5. Always send "frida" to chall05() 를 진행하였고 이번 실습에서는 6. Run chall06() after 10 seconds with correct value를 진행하겠습니다. 해석하면 10초 후 chall06()를 실행하라고 합니다. 해당 메서드를 보겠습니다.
메서드 확인 시 정수형 인자 'i'를 입력 받고 challenge_06.confirmChall06() 메서드를 호출하여 'i'를 전달하고 반환값을 받는데 그 값이 'true'일 경우 문제가 해결되는 구조입니다. challenge_06() 클래스 내 confirmChall06() 메서드를 확인해보겠습니다.
confirmChall06() 메서드는 정수형 인저 'i'를 입력받고 두 가지 조건을 확인합니다.
1) i == chall06 => 'i'의 값과 'chall06' 변수의 값이 같은지
2) System.currentTimeMillis() > timeStart + 10000; => 현재 시간이 'timeStart'에 10초를 더한 값보다 큰지
먼저 'i'의 값과 비교되는 'chall06' 변수를 확인하기 위해 해당 변수가 존재하는 메서드를 확인해보겠습니다.
해당 메서드는 정수 'i'를 인자로 받아 'chall06' 변수에 더한 후 'chall06'의 값이 9000을 초과하면 'i'로 설정합니다. 그래서 addChall06() 메서드가 인자값을 어디서 받는지 확인해봤습니다.
MainActivity 내 onCreate() 메서드 내 해당 코드가 존재하는데 먼저 'challenge_06()' 클래스 내 'startTime' 메서드를 호출합니다. 'startTime()' 메서드는 위에서 확인하지는 않았지만 public static void startTime() {timeStart = System.currentTimeMillis();} 입니다. 즉 startTime() 메서드를 호출하게 되면 현재 시간을 timeStart 라는 변수에 저장하게 됩니다.
그 다음은 addChall06() 메서드를 호출하며 이 때 1~50 사이의 랜덤한 정수를 생성하여 전달합니다.
마지막으로 Timer 객체를 생성하고 scheduleAtFixedRate() 메서드를 사용하여 일정 시간을 간격으로 'TimeTask"를 실행하게 합니다. 'TimerTask'는 'run' 메서드를 오버라이드하여 실행할 작업을 정의하는데 Random 객체를 사용하여 1~50 사이의 랜덤한 정수를 생성 후 생성한 정수를 'challenge_06' 클래스의 'addChall06' 메서드에 전달하여 'chall06' 변수에 저장합니다.
일련의 과정을 정리해보겠습니다
1. challenge_06.startTime() 호출
1) startTime 메서드를 호출하여 timeStart 변수에 현재 시간 기록
2) timeStart는 시스템의 현재 시간간을 밀리초 단위로 저장
2. challenge_06.addChal06 메서드 호출
1) addChall06 메서드를 호출하여 1~50 사이의 랜덤한 값을 chall06 변수에 더함
3. Timer 설정
1) Timer 객체를 생성 후 1초마다 1~50 사이의 랜덤한 값을 chall06 변수에 더하는 작업을 반복
4. challenge_06.confirmChall06 메서드 호출
1) confirmChall06 메서드를 호출하여 정수형 인자값을 전달
2) 해당 메서드는 인자값을 받은 후 두 가지 조건을 확인
ㄱ) 매개변수 i가 chall06의 값과 같은지
ㄴ) 현재 시간이 timeStart로부터 10초 지났는지
3) 두 조건이 일치 시 true 값 반환
// Challenge 06
setTimeout(function(){
let fridalab6 = Java.use('uk.rossmarks.fridalab.challenge_06');
Java.choose('uk.rossmarks.fridalab.MainActivity', {
onMatch: function(instance){
instance.chall06(fridalab6.chall06.value);
},
onComplete: function(){
console.log("[***]Challenge06_Sucess!!![***]");
}
});
}, 10000);