[목차]

 

 

1. 환경 구성

2. 루팅 탐지 우회 실습

3. 정리 및 팁

 

 


 

 

1. 환경 구성

 

실습에 사용할 앱은

OWASP에서 배포한

UnCrackable이라는 앱으로

 

앱 보안 진단 입문용으로 매우

유용하게 사용할 수 있는 앱!

 

 

(1) apk 파일 다운로드

https://github.com/OWASP/owasp-mastg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk

 

View raw 또는 Download

클릭하여 apk 파일 다운로드

 

 

 

 

(2) 앱 설치

C:> adb install file.apk
 

 

 

 

(3) 정상 설치 확인

 

 

 

실행시켜 보면

 

루팅 탐지에 걸림!

 

 


 

 

 

2. 루팅 탐지 우회 실습

 

 

(1) 루팅 로직 확인

jadx로 파일을 불러온 뒤

 

 

 

힌트가 되었던 문구를 찾아 살펴보면

 

 

MainActivity 클래스 내부

onCreate 메서드 내부에서

a라는 메서드를 호출하면서

인자 값으로 루팅 탐지 문자열을

전달하고 있다.

 

 

 

(2) a 메서드 확인

 

같은 MainActivity 클래스 내부에

a라는 메서드가 존재하며

a 메서드 인자 값으로

String str을 받고 있다.

 

str에 탐지 시 뜨는 문구를 볼 수 있고

앱 종료 시까지 작동 방식 확인이 가능하다.

 

 

 

 

(3) 아이디어 1

시스템 종료 함수 onClick 메서드를 후킹 해

OK 버튼을 눌러도 앱이 종료되지 않도록

만든다.

 

 

 

a. 기본 뼈대

setImmediate(function(){
	Java.perform(function(){
		var exit_bypass = Java.use("");		// 클래스에 대한 객체를 받아오기 위해 Java.use
		exit_bypass.onClick.implementation = function(arg, arg2){ // onClick 현재 인자값 2개 있음
			console.log("[+] Exit 방지 성공!");
		}
	})
})
 

 

 

b. 코드 확장

onClick을 재작성 해야 하는데

현재 onClick은 OnClickListetner()를 통해

내부에서 만들어지고 OnClickListener는

android.content.DialogInterface.OnClickListener

클래스로 불러온다.

 

 

android.content.DialogInterface.OnClickListener

클래스가 무엇인지 검색해 보면

 

 

public 메서드로 기본적으로 제공되며

동일한 폼으로 작성되어 있는데

 

 

특이한 점은 해당 클래스는 클래스가 아닌

'인터페이스'라는 점!

 

따라서 클래스 객체를 반환하기 위해

해당 클래스를 사용하는 경우

setImmediate(function(){
	Java.perform(function(){
		var exit_bypass = Java.use("android.content.DialogInterface.OnClickListener");
		exit_bypass.onClick.implementation = function(arg, arg2){ 
			console.log("[+] Exit 방지 성공!");
		}
	})
})
 

 

패키지 명 확인 후

 

돌리는데 spawn 가능하도록 -f로

돌려보면

 

 

프리다 공식 API에서

해당 인터페이스를 다루는 기능이

없는 것으로 보여 애러가 발생!

 

 

따라서 해당 방법은 실패!

 

 

 

(3-1) 아이디어 2

 

 

onClick 실행 시 System.exit가

실행되지 않도록 한다.

 

System 메서드는 java.lang.System에서

가져오는 메서드.

 

 

코드 작성 후

setImmediate(function(){
	Java.perform(function(){
		var exitBypass = Java.use("java.lang.System");
		exitBypass.exit.implementation = function () {  // function (arg) 받아도 상관 없음
			console.log("[*] 루팅 탐지 후킹 성공!");
		}
	})
})
 

 

돌려보면

 

 

에러 없이 잘 돌아가면서

앱이 실행되고

 

 

exit을 호출했던 OK를 눌러주면

 

 

 

탐지 우회에 성공하여 정상 접속됨!

 

해결 완료!

 

 

 


 

 

 

3. 정리 및 팁

 

 

디컴파일러 jadx 도구로

해당 문제의 코드를 확인한 결과

 

UnCrackable-Level1 루팅 탐지의 경우

OK 버튼을 클릭하면 System.exit(0);을 통해

앱이 종료되는 것을 확인하였고

 

이를 통해 java.lang.System의

exit 메서드를 재작성(implementation) 하면

문제가 해결될 것을 알 수 있었는데

 

앱이 종료되는 부분만 해도

다양한 방법이 존재하며

 

루팅 탐지하는 앱마다

보이는 행위는 각각 다르기에

 

그 행위에 기반하여

핵심 부분을 판단한 뒤

우회를 시도하는 것이 중요하다.

 

 

처음에 확인한

MainActivity의 a메소드 자체를

implementation 하게 되는 경우

 

루팅 탐지 우회와 무관한

기 구현된 코드가 정확히 동작하도록

코드로 표현해야 하기 때문에

상당히 복잡해지는데

 

이처럼 앱마다

우회하고 싶은 부분의

핵심을 파악하여

 

가장 간단한 방법으로

프리다 우회 코드를

작성하는 것이 좋다.

 

 

순수 개인 공부 목적으로

실사용 앱을 진단하면서

우회 등 진단 연습을 하는 경우

 

관련 내용은 절대

외부에 공개해선 안되니

주의해야 한다!

 

728x90

+ Recent posts