Root권한이 허용된 단말기에 앱 설치 후 실행할 경우 루팅이 탐지되며 강제종료 되는 것을 확인

 

이번에 루팅을 해제한 상태에서 실행할 경우

비밀키를 입력하라는 메시지가 출력된다. 틀린 비밀키 입력 시 다시 시도하라는 문구가 출력

 

2. 목표

1. 비밀키 검증 우회

2. 비밀키를 찾아서 입력

두 가지 방법으로 좁힐 수 있다.

 

3. 풀이

1) JEB3 Decompiler를 사용하여 Manifest부터 확인

Manifest 확인 시, 패키지명은 owasp.mstg.uncrackable1, 메인 액티비티 이름은 sg.vantagepoint.uncrackable1.MainActivity이다.

 

2) 메인 액티비티 sg.vantagepoint.uncrackable1.MainActivity 확인

루팅 탐지로직과 비밀키 입력 시 성공여부를 판단하는 로직이 보이며 각각 onCreate, verify 메서드라는 이름을 가지고 있다.

 

3) 루팅탐지 로직 분석

이 루팅을 탐지하는 로직이며, sg.vantagepoint.a 패키지 안의 c 클래스a, b, c 메서드를 모두 false를 만족하여야 루팅 탐지가 안되는 것을 확인할 수 있다.

c 클래스의 내부를 확인한 결과 a, b, c 메서드가 각각 무슨 일을 하는지 확인 할 수 있다.

a 메서드는 su의 PATH를 탐지하여 단말기에 su 경로가 존재하는지 확인

b 메서드는 test-keys라는 문자열이 있는지 확인

c 메서드는 su 바이너리들이 있는지 탐지

 

4) 루팅탐지 우회를 위한 Frida 코드 작성 후 실행

Java.perform(function(){
	// 콘솔로그로 정상 동작하는지 테스트 수행
	console.log("[*] passed!");
	
	// Rooting 우회
	var ByPassRooting=Java.use("sg.vantagepoint.a.c");
	console.log("[*] Rooting Detect_hook!!");
	ByPassRooting.a.implementation = function(param){return false;}
	ByPassRooting.b.implementation = function(param){return false;}
	ByPassRooting.c.implementation = function(param){return false;}
	console.log("[*] Rooting Bypass!!");
});

 

 

5) 루팅 우회 후, 비밀키 입력할 경우 다시 입력하라는 문구 출력

 

6) 비밀키를 알아내어 검증 우회 시도

UnCrackable에서 사용하는 모든 String 문자열을 모두 Console.log로 출력하는 후킹 코드 작성

Java.perform(function(){
	// 콘솔로그로 정상 동작하는지 테스트 수행
	console.log("[*] passed!");
	
	// Rooting 우회
	var ByPassRooting=Java.use("sg.vantagepoint.a.c");
	console.log("[*] Rooting Detect_hook!!");
	ByPassRooting.a.implementation = function(param){return false;}
	ByPassRooting.b.implementation = function(param){return false;}
	ByPassRooting.c.implementation = function(param){return false;}
	console.log("[*] Rooting Bypass!!");

	// 사용하고 있는 텍스트 출력하기
	var HookString = Java.use("java.lang.String");
	HookString.equals.implementation = function(param){
		console.log(param);
		return true;
	}
});

실행 결과, 사용하고 있는 모든 문자열이 출력되고 있어서 비밀키로 의심되는 문자열만 필터링한다.

이를 위한, 후킹코드를 재작성한다.

Java.perform(function(){
	// 콘솔로그로 정상 동작하는지 테스트 수행
	console.log("[*] passed!");
	
	// Rooting 우회
	var ByPassRooting=Java.use("sg.vantagepoint.a.c");
	console.log("[*] Rooting Detect_hook!!");
	ByPassRooting.a.implementation = function(param){return false;}
	ByPassRooting.b.implementation = function(param){return false;}
	ByPassRooting.c.implementation = function(param){return false;}
	console.log("[*] Rooting Bypass!!");

	// 사용하고 있는 텍스트 출력하기
	var HookString = Java.use("java.lang.String");
	HookString.equals.implementation = function(param){
		// 키 값이 아닌 항목 추가
		if (param == "ko-KR" | param == "owasp.mstg.uncrackable1" | param == "android.view.Display$HdrCapabilities" |  param == "SEC_FLOATING_FEATURE_MESSAGE_CONFIG_PACKAGE_NAME" | param == "sg.vantagepoint.uncrackable1.MainActivity" | param == "value" | param == "_track_generation" | param == "android.content.res.Configuration" | param == "0x4f4c" | param == "user" | param == "android.graphics.Rect" | param == "SEC_FLOATING_FEATURE_COMMON_SUPPORT_ULTRA_POWER_SAVING" | param == "SEC_FLOATING_FEATURE_COMMON_SUPPORT_SAFETYCARE" | param == "time_12_24" | param == "java.io.tmpdir" | param == "package" | param == "/data/app/owasp.mstg.uncrackable1-Qm86DR0g7jzG1URJA_qGOA==/base.apk" | param == "_generation" | param == "android.util.MemoryIntArray" | param == "sans-serif" | param == "sans-serif-medium" | param == "v30" | param == "android.os.ParcelFileDescriptor" | param == "settings" | param == "_generation_index" | param == "_generation_index" | param == "window" | param == "KRW" | param == "0"){
		}
		else{
			console.log(param);
		}
		return true;
	}
});

비밀키 값으로 의심되는 문자열 중 “I want to believe”가 보이며, 루팅 해제 후, 키 값 확인

 

7) 비밀키 값 확인

1. 분석 과정

1. APK 파일 구조체 파악
2. 구조체를 보기 위해 APK 파일 디컴파일
   - smali 코드로 변환
   - smali 코드를 java로 변경
   - APK > smali > java 이 과정을 알아야함
   - 원하는 smali 코드로 분석할지, java 코드로 변환해서 분석할지 선택
   - smali 코드는 난독화가 되어있으면 분석에 힘듬, java 코드로 분석 추천
3. 앱 동작과정 분석 (동적분석, 정적분석)
   - 참고로 사람마다 분석 스타일이 다름
4. 디컴파일이 완료되었으면, java 코드를 볼 수 있고, 소스코드 분석 포인트를 잡아야함
   - 이것도 분석 스타일이 다름
5. frida를 셋팅하여 후킹 준비
    - frida의 기능을 파악
    - 사용할 기능은 frida docs를 검색해서 기능을 직접 찾아야함
6. 후킹 환경 세팅
7. 실제 후킹 시도

 

2. APK 파일 구조체 파악

JEB Decompiler for Android를 다운로드 받아 실행하고, APK 파일을 업로드 후,
Manifest에서 Package 이름 확인, MAIN 액티비티의 이름 확인
 
Bytecode/계층구조 탭에서 해당 액티비티의 이름을 찾아가서 키보드의 Tab 버튼을 눌러 구조체 파악
 

3. frida 셋팅

pip install frida
pip install frida-tools
# frida 실행
frida -h
 
frida 서버 파일 다운로드
 
루팅 적용된 진단 폰 연결 후, 아래와 같이 입력 (루팅 과정 생략)
adb push frida-server-16.0.19 /data/local/tmp
 
ls -l 명령어 사용 시 권한이 666으로 되어 있는 것을 확인 (실행 권한이 없다는 뜻)
 
실행 권한 부여 후, frida-server 실행
chmod 777 frida-server-16.0.19
./frida-server-16.0.19 &
 
frida-server 작동 여부 확인
 
진단 폰 연결 후, adb shell을 실행하여 frida-server 실행
adb shell 'su -c /data/local/tmp/frida-server-16.0.19 &'
 
 

+ Recent posts