Hooking FridaLab #4 FridaLab 6~8, all
2023. 3. 28. 01:48ㆍAndroid
주제: 후킹을 통한 FridaLab해결과 리얼 앱 변조
기간: 22.11.21 ~ 22.12.20
목차
00) Frida란?
01) Frida 서버 설치 (환경 세팅)
02) 기초 Frida사용법
03) FridaLab이란?
04) FridaLab 1~5
05) FridaLab 6~8
06) FridaLab all
07) 리얼 앱 후킹
스크립트 실행 방법은 이전 글 참고
2023.03.28 - [Android] - Hooking FridaLab #3 FridaLab 1~5
05) FridaLab 6~8
- chall_06.js
setImmediate(function() {
Java.perform(function() {
console.log("[*] Script start");
//chall06
let MainActivityInstance;
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch : function(instance){
console.log("[*] Instance: " + instance);
MainActivityInstance = instance;
},
onComplete : function(){
}
});
let challenge_06 = Java.use("uk.rossmarks.fridalab.challenge_06");
setTimeout(function () {
MainActivityInstance.chall06(challenge_06.chall06.value);
console.log("[*] chall06 is called, value: " + challenge_06.chall06.value);
}, 10000);
console.log("[*] Script finish");
});
});
setTimeout() 함수를 사용하여 실행 후 10초 뒤에 콜백 함수가 작동되도록 하였다.
- chall_07.js
setImmediate(function() {
Java.perform(function() {
console.log("[*] Script start");
//chall07 : way to solve with bruteforcing
let challenge_07 = Java.use("uk.rossmarks.fridalab.challenge_07");
for(var i = 1000; i < 10000; i++){
var pinValue = String(i);
if(challenge_07.check07Pin(pinValue)){
console.log("[*] chall07 pin value: " + pinValue);
break;
}
}
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch : function(instance){
instance.chall07(pinValue);
console.log("[*] Instance: " + instance);
},
onComplete : function(){
}
});
console.log("[*] Script finish");
});
});
문제의 지시사항은 bruteforcing을 통한 Pin 확인이므로 chall_07.js에서는 브루트포싱을 통해 값을 맞추는 방식으로 코딩하였으나, 직접 값을 가져오는것이 더 간편하다고 판단하였다.
따라서 아래 전체 코드에서는 직접 값을 가져오는 방식을 사용하여 총 두가지의 방식으로 코딩하였다.
- chall_08.js
setImmediate(function() {
Java.perform(function() {
console.log("[*] Script start");
//chall08
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch : function(instance){
var id = instance.findViewById(0x7f07002f);
var button = Java.use("android.widget.Button");
var str = Java.use("java.lang.String");
var check = Java.cast(id, button);
console.log("[*] chall08 button text set: Confirm");
check.setText(str.$new('Confirm'));
},
onComplete : function(){
}
});
console.log("[*] Script finish");
});
});
jadx-gui 분석을 통해 id의 주소를 찾고 findViewById 메소드와 Java.cast()함수를 통해 버튼 정보를 가져올 수 있다.
06) FridaLab all
- chall.js
setImmediate(function() {
Java.perform(function() {
console.log("[*] Script start");
//chall01
let challenge_01 = Java.use("uk.rossmarks.fridalab.challenge_01");
challenge_01.chall01.value = 1;
console.log("[*] chall01 value set: 1");
//chall02
let MainActivityInstance;
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch : function(instance){
console.log("[*] Instance: " + instance);
MainActivityInstance = instance;
},
onComplete : function(){
}
});
MainActivityInstance.chall02();
console.log("[*] chall02 is called");
//chall03 : click button to run
var MainActivity = Java.use("uk.rossmarks.fridalab.MainActivity");
MainActivity.chall03.implementation = function(){
console.log("[*] chall03 return: true");
return true;
}
//chall04
String = "frida";
MainActivityInstance.chall04(String);
console.log("[*] chall04 is called, send Str: " + String);
//chall05 : click button to run
MainActivity.chall05.implementation = function (String) {
this.chall05("frida");
console.log("[*] chall05 is called, Str: " + String);
};
//chall06 : run after 10 seconds
let challenge_06 = Java.use("uk.rossmarks.fridalab.challenge_06");
setTimeout(function () {
MainActivityInstance.chall06(challenge_06.chall06.value);
console.log("[*] chall06 is called, value: " + challenge_06.chall06.value);
}, 10000);
//chall07: get value directly, same as chall06
let challenge_07 = Java.use("uk.rossmarks.fridalab.challenge_07");
MainActivityInstance.chall07(challenge_07.chall07.value);
console.log("[*] chall07 is called, value: " + challenge_07.chall07.value);
//chall08 : click button to run
//<public type="id" name="check" id="0x7f07002f" />
var id = MainActivityInstance.findViewById(0x7f07002f);
var button = Java.use("android.widget.Button");
var str = Java.use("java.lang.String");
var check = Java.cast(id, button);
console.log("[*] chall08 button text set: Confirm");
check.setText(str.$new("Confirm"));
console.log("[*] Script finish");
});
});
마지막 게시글은 이전에 게시했던 REAL Android Crack #2~4와 마찬가지로 악용 방지를 위해 비공개글로 게시한다.
'Android' 카테고리의 다른 글
Hooking FridaLab #3 FridaLab 1~5 (0) | 2023.03.28 |
---|---|
Hooking FridaLab #2 기초 Frida 사용법, FridaLab이란? (0) | 2023.03.27 |
Hooking FridaLab #1 개요 및 환경 세팅 (0) | 2023.03.14 |
REAL Android Crack #4 분석, 변조 (0) | 2022.09.13 |
REAL Android Crack #3 분석, 변조 (여러개의 apk로 이루어진 어플 설치) (0) | 2022.09.13 |