Hooking FridaLab #3 FridaLab 1~5

2023. 3. 28. 01:02Android

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


후킹에 앞서 jadx-gui를 이용하여 프로그램을 분석하고 후킹할 프로그램의 패키지, 함수, 메소드, 변수 등을 파악하였다.

 

후킹 스크립트 실행 방법

 

frida 명령어를 사용하여 자바스크립트 파일만으로도 후킹을 할 수 있으나, 더 편리하게 명령어를 입력하기 위해 자바스크립트 코드를 포함하는 파이썬 코드를 작성하였다.

자바스크립트 후킹 코드를 더 편하게 작성하기 위해 파이썬 코드 안에 자바스크립트 코드를 그대로 작성하는 대신 .js파일을 파이썬 코드가 읽어오는 형태로 작성하였다.

 

- base.py

# MIsutgaRU

import frida, sys

bundle = "uk.rossmarks.fridalab" #package name
scriptfile = "./chall.js"
#scriptfile = "../FridaLab/파일명.js"

with open(scriptfile, 'r') as f:
    script = f.read()

device = frida.get_usb_device(5)
target_process = device.spawn(bundle)
process_session = device.attach(target_process)

script = process_session.create_script(script)
script.load()

device.resume(target_process)
sys.stdin.read()

 

자바스크립트 코드를 포함한 파이썬(.py) 코드 실행 시 아나콘다 프롬프트에 아래 명령어를 통해 후킹한다.

python base.py

 

04) FridaLab 1~5

후킹에 사용되는 메소드에는 익숙하지 않아 연습을 위해 다른 코드들을 참고하며 프로젝트를 진행했다.

그대로 적용시키면 안되는 경우도 있었고 내가 원하는 방식으로 코딩되어있지 않았던 경우도 있었기 때문에 대부분의 코드는 새로 다시 작성하였다.

 

- chall_01.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("[*] Script finish");
	});
});

실행 결과

- chall_02.js

setImmediate(function() {
	Java.perform(function() {
		console.log("[*] Script start");
		
		//chall02
		let MainActivity;
		Java.choose("uk.rossmarks.fridalab.MainActivity", {
			onMatch : function(instance){
				console.log("[*] Instance: " + instance);
				MainActivity = instance;
			},
			onComplete : function(){
			}
		});
		MainActivity.chall02();
        
		console.log("[*] Script finish");
	});
});

인스턴스화된 함수를 강제 실행하기 위해서는 .use 대신 .choose를 사용해야한다.

실행 결과

 

- chall_03.js

setImmediate(function() {
	Java.perform(function() {
		console.log("[*] Script start");
		
		//chall03
		var challenge_03 = Java.use("uk.rossmarks.fridalab.MainActivity");
		challenge_03.chall03.implementation = function(){
			console.log("[*] Return: true");
			return true;
		}
        
		console.log("[*] Script finish");
	});
});

 

.implementatin을 사용하면 CHECK버튼을 눌렀을 때 작동한다.

실행 결과

- chall_04.js

setImmediate(function() {
	Java.perform(function() {
		console.log("[*] Script start");
		
		//chall04
		let MainActivity;
		Java.choose("uk.rossmarks.fridalab.MainActivity", {
			onMatch : function(instance){
				console.log("[*] Instance: " + instance);
				MainActivity = instance;
			},
			onComplete : function(){
			}
		});
		String = "frida";
		MainActivity.chall04(String);
        
		console.log("[*] Script finish");
	});
});

실행 결과

 

- chall_05.js

setImmediate(function() {
	Java.perform(function() {
		console.log("[*] Script start");
		
		//chall05
		var MainActivity = Java.use("uk.rossmarks.fridalab.MainActivity");
		MainActivity.chall05.implementation = function (String) {
			this.chall05("frida");
			console.log('[*] chall05 is called' + ', ' + 'Str: ' + String);
		};
        
		console.log("[*] Script finish");
	});
});

3번과 마찬가지로 .implementatin을 사용하여 CHECK버튼을 눌렀을 때 작동한다.

실행 결과