[andriod 실습] frida lab 7번, 8번
7. Bruteforce check07Pin() then confirm with chall07()
chall07Pin() 메소드에 브루트 포스( 무차별 대입)를 시도하여 chall07()로 메소드가 무슨 값인지 확인하는 것으로 보인다.
그니까 쉽게 말하자면 pin값을 무차별 대입으로 때려 맞추라는 소리
먼저 소스를 분석해 보자
public void chall07(String str) {
if (challenge_07.check07Pin(str)) {
this.completeArr[6] = 1;
} else {
this.completeArr[6] = 0;
}
}
인자로 전달되어진 str 값을 challenge_07 클래스의 check07Pin() 메소드를 호출 할 때 인자로 전달 했을 때 참이면 정답으로 처리함을 알 수 있다. 6번에서 그랬던것 처럼 더블클릭하여 정의 부분으로 이동할 수 있다.
package uk.rossmarks.fridalab;
/* loaded from: classes.dex */
public class challenge_07 {
static String chall07;
public static void setChall07() {
chall07 = BuildConfig.FLAVOR + (((int) (Math.random() * 9000.0d)) + 1000);
}
public static boolean check07Pin(String str) {
return str.equals(chall07);
}
}
인자로 전달된 str 값을 chall07 라는 변수와 비교하여 같을시 참을 반환한다. 이는 mainacivity에서 호출되며, 이 값은 1000~9999중 랜덤한 값으로 결정 된다.
따라서 이 범위로 무차별 대입 하여 어떤 값이 저장된건지 확인하고, 값을 찾은 후에, mainactivity 인스턴스를 가져와 chall07 메소드를 호출 할 때 전달 하는 프로그램을 만드면 된다.
코드 :
setTimeout(function(){
console.log("\n 10 seconds later...");
setImmediate(function(){
Java.perform(function(){
let challenge_main;
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch: function(instance) {
challenge_main = instance;
const chall_06 = Java.use("uk.rossmarks.fridalab.challenge_06");
chall_06.confirmChall06.implementation = function () {
console.log("\n6번 문제 해결");
return true;
}
challenge_main.chall06(666);
},
onComplete: function() {}
});
})
})
}, 10000);
8. Change 'check' button's text value to 'Confirm’
화면 내의 check 버튼 글씨를 confrim으로 바꿔라
public boolean chall08() {
return ((String) ((Button) findViewById(R.id.check)).getText()).equals("Confirm");
}
}
R class에 check를 확인하여 문제를 풀어보면 될 것 같다.
java.cast를 이용하여 chall08 메소드의 정의 부분을 봤을때 findViewById() 메소드로 가져온 인스턴스를 button 클래스로 형변환 하는것을 구현 하였다
Java.cast(handle, klass)
handle에 전달된 인스턴스를 klass에 전달된 클래스로 캐스팅하는 함수이다.
setImmediate(function () {
Java.perform(function () {
var klass = Java.use("android.widget.Button");
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch: function (instance) {
var checkid = instance.findViewById(0x7f07002f);
var check = Java.cast(checkid, klass); // Java.use 반환 값을 가져온다
var string = Java.use("java.lang.String");
check.setText(string.$new("Confirm")); // $new 메서드는 java.use로 사용한 klass로 반환된 객체를 new 선언 순간에 인스턴스화 시켜줌
},
onComplete: function () {
console.log("\n8번 문제 해결!");
},
});
});
});
8번 문제는 혼자 해결하기 어려워 블로그를 참조했다.
https://takudaddy.tistory.com/623#recentComments
9. 프리다 연습 - FridaLab (2) 문제 풀이 (6-8번)
[목차] 6. Run chall06() after 10 seconds with correct value 7. Bruteforce check07Pin() then confirm with chall07() 8. Change 'check' button's text value to 'Confirm’ 6. Run chall06() after 10 seconds with correct value > 올바른 값으로 10초 후 c
takudaddy.tistory.com
해결