본문 바로가기

모바일 앱 해킹

[Frida] Uncrackable Level 1 풀이

앱을 실행하면 다음과 같이 루트가 탐지됐다는 문구가 뜬다

 

어디에서 발생하는 것인지 소스코드를 확인해보자.

 

 

MainActivity 클래스에서 a 메소드를 통해 루트 탐지 문구가 발생하는 것을 알아냈다

그렇다면 a 메소드를 확인해보자

 

 

setButton 함수로 ok 버튼 만들고, 해당 버튼을 클릭하면 onClick 메소드가 실행되어 system.exit에 의해 앱이 종료된다는 것을 파악했다

 

그러니까 ok를 눌러도 앱이 종료되지 않게 후킹을 하면 루트 탐지 우회를 할 수 있지 않을까?

 

여기서 잠깐 OnClick 메서드는 OnClickListener 인터페이스에 정의되어 있는 메서드이다.

프리다에는 인터페이스를 가져오는 API가 없기 때문에 onClick 메서드 대신 안에 있는 system.exit를 재작성할 것이다.


(리스너는 말그대로 듣고 있는 녀석이다. 리스너 내의 메서드를 구현해 놓으면 특정 이벤트를 계속 듣고 있다가 이벤트가 발생하는 시점에 메서드를 호출해준다.)

 

 

setImmediate(function() {
	Java.perform(function(){
		var exit_bypass = Java.use("java.lang.System");
		exit_bypass.exit.implementation = function(arg1){
			// 앱 종료 대신 콘솔 로그 출력하도록 함수 재작성
			console.log("[*]Exit Bypass");
		}
	})
})

 

 


 

루팅 탐지 우회하고 나니 Secret String을 찾아서 검증하라고 한다

소스코드를 확인해보자

 

 

a 메소드의 리턴 값이 true이면 Success(검증)되는 것을 볼 수 있다. 그렇다면 a 메소드도 확인해보자

 

 

우선 가장 쉬운 방법은 a 메소드가 무조건 true를 반환하게 만드는 것이다

 

1. a.a(obj)를 무조건 true 반환하도록 재작성

setImmediate(function() {
	Java.perform(function(){
		var Secret = Java.use("sg.vantagepoint.uncrackable1.a");
		Secret.a.implementation = function(arg1){
			return true;
		}
	})
})

 

 

 

성공

 

 

 

 

2. bArr 값을 알아내기

출제의도는 이 방법이다

 

a 메소드의 return 부분을 보면 입력한 str과 bArr 값을 비교하는 것을 볼 수 있다. 결국 bArr이 Secret String이다.

그리고 bArr는 sg.vantagepoint.a.a.a 메소드의 반환 값인 것을 알 수 있다.  해당 메소드를 확인해보자 

 

sg.vantagepoing.a.a.a를 후킹해서 Secret String을 알아내자

 

setImmediate(function() {
	Java.perform(function(){
		var decryptClass = Java.use("sg.vantagepoint.a.a");
		decryptClass.a.implementation = function(arg1, arg2){
			var secret_string = this.a(arg1, arg2);
			for(var i=0; i<secret_string.length; i++){
				console.log(String.fromCharCode(secret_string[i]));
			}
            // bArr에 값을 줘야함
			return secret_string;
		}
	})
})

 

 

아무 값이나 입력하고 VERIFY 버튼을  클릭했더니 "I want to believe"라는 문자가 콘솔에 출력됐다.

 

해당 값을 입력하니까

 

검증에 성공했다

 

 

 

참고

https://lyk00331.tistory.com/103

https://velog.io/@minmoong/Uncrackable-problem-solve