해당 문제의 경우, 클래스 challenge_01의 변수’chall01’을 ‘1’로 변경해야한다.
1. 소스 코드 분석
소스 코드를 한 줄 단위로 살펴보면 다음과 같다.
public class Challenge_01 {
//'Challenge_01' 이라는 클래스 생성
static int chall01;
//int(정수형)의 static(정적)변수 'chall01' 선언
// call01은 클래스 변수이다.
public static int getChall01Int() {
//static(정적) getChall01Int 메소드 생성
return chall01;
//chall01를 반환
}
}
.value 를 통해 chall01() 메소드를 직접 변경을 하거나 .implementation으로 함수를 재작성하여 1을 반환하도록 해야한다. .
참고로 static 정적 변수는 초깃값을 지정하지 않으면 default 값이 0이다. 여기서는 따로 chall01 변수의 값을 지정하지 않았으니, 초깃값은 0으로 자동 초기화가 되는 것이다.
2. chall01() 초기 값 확인
setImmediate(function(){
//프로세스 자동 종료 방지
Java.perform(function(){
// 단말기가 연결되어 있는지 확인 및 함수 호출
var change_value = Java.use("uk.rossmarks.fridalab.challenge_01");
//메소드를 후킹하기 위해 앱에서 사용하는 클래스와 연동되는 변수 선언
var result = change_value.getChall01Int()
console.log("[*] chall01 value", result);
});
});
여기서 getChall01Int 함수는 변수가 아닌 메소드 형태이기 때문에 함수명() 으로 해줘야 한다.
처음에는 변수로 생각해서 getChall01Int.value 했다가 아래와 같은 결과가 나왔다.
그래서 찾아보니 위에서는 getchall01Int를 호출할 때 change_value라는 변수를 통해서 challenge_01이라는 클래스를 호출하고 있으며, 메소드를 수행하기 위해서는 객체를 통해서 메소드를 수행할 수 있다는 사실을 알고 수정했다.
물론, 변수에 직접 접근 후 초기값을 불러와도 된다.
setImmediate(function(){
Java.perform(function(){
var change_value = Java.use("uk.rossmarks.fridalab.challenge_01");
console.log("[*] check chall01 value =" ,change_value.chall01.value);
});
});
3-1. 문제 풀이(1) - 변수 value를 직접 설정
setImmediate(function(){
Java.perform(function(){
console.log("[*] start");
var change_value = Java.use("uk.rossmarks.fridalab.challenge_01");
//메소드를 후킹하기 위해 앱에서 사용하는 클래스와 연동되는 변수 선언
console.log("[*] before chall01 value =" ,change_value.chall01.value);
change_value.chall01.value = 1;
// chall01변수의 값을 직접 설정
console.log("[*] after chall01 value =" ,change_value.chall01.value);
console.log("[*] clear chall01");
});
});
3-2. 문제풀이(2) - 함수 재작성(implementation)
setImmediate(function(){
Java.perform(function(){
console.log("[*] start");
var change_value = Java.use("uk.rossmarks.fridalab.challenge_01");
//메소드를 후킹하기 위해 앱에서 사용하는 클래스와 연동되는 변수 선언
console.log("[*] before chall01 value =" ,change_value.chall01.value);
change_value.chall01.value = 1;
// chall01변수의 값을 직접 설정
console.log("[*] after chall01 value =" ,change_value.chall01.value);
console.log("[*] clear chall01");
});
});