Hooking FridaLab #4 FridaLab 6~8, all

2023. 3. 28. 01:48Android

주제: 후킹을 통한 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

 

Hooking FridaLab #3 FridaLab 1~5

주제: 후킹을 통한 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) 리

mi-sutga-ru.tistory.com

 

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와 마찬가지로 악용 방지를 위해 비공개글로 게시한다.