앱 진단(Android)/FridaLab 실습

6. Run chall06() after 10 seconds with correct value

보안개구리 2024. 6. 28. 21:28

 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);