CTF/Frida

Frida 후킹 #2 수동으로 rooting우회하기(OWASP Level1)

종금 2022. 9. 25. 16:55
반응형

이전 자동으로 bypass를 했다면 
이번에서는 직접 스크립트를 짜보며 넘어가보자.
https://github.com/OWASP/owasp-mastg/tree/master/Crackmes/Android

 

GitHub - OWASP/owasp-mastg: The Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app secur

The Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes the technical processes for verifying the contr...

github.com

Level1.apk 다운로드

기존에서 이곳에서 받은 apk파일을 사용한다.
루팅을 막는건 어느 코드든 루팅을 막는것이 존재하기 때문이다. 
그걸 찾기위해서 samli를 쉽게 읽을 수 있는 툴 jadx을 사용해보자

https://github.com/skylot/jadx

 

GitHub - skylot/jadx: Dex to Java decompiler

Dex to Java decompiler. Contribute to skylot/jadx development by creating an account on GitHub.

github.com

 

다운로드는 아래 사이트에서 gui파일(GUI No JRE WIN .exe)를 받았다.

실행하면 이렇지만 실행눌러 강제로 시작.

혹시 java 없다면 여기서 설치

https://www.oracle.com/java/technologies/downloads/#jdk19-windows

 

Download the Latest Java LTS Free

Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts.

www.oracle.com

 

jadx를 실행해 level1을 열면 다음과 같이 나온다. 특히 먼저 봐야할 곳은 "AndroidManifest.xml"을 보면된다.
여기서 제일 처음에 activity에 adnroidname부분을 보면
sg.vantagepoint.uncrackable1.Mainactivity가 보인다. 그러면 이제 소스코드 아래 저걸 따라간다.

해당 액티비티를 찾아볼때 루팅부분을 찾으면된다. 
(국내앱은 한글이라 ㅁㅁㅁ으로보이지만 영어는 확실히 잘보인다)

 

즉 "line 18"을 보면 같은 메시지에 밑에 19라인에서 클릭(Button On.Click 및 OK메시지" 버튼과 그리고 마지막 system.exit까지 이걸 통해서 이부분이 딱 맞다고 느껴진다. 
그럼 이제 js코드를 작성하면 된다. 
일단 js의 기본뼈대를 작성한다.(https://redteam-securitylab.tistory.com/16)

더보기
import frida, sys

#Taget package name
Target = "owasp.mstg.uncrackable1"

def on_message(message, data):
    print("{} -> {}".format(message, data))


jscode = """
# java 코드 적는 곳.

"""

# 타겟 로드 후 프로세스에 연결
try:
    device = frida.get_usb_device(timeout=10)
    pid = device.spawn([Target])
    print("Target is starting.. pid:{}".format(pid))
    process = device.attach(pid)
    device.resume(pid)
    script = process.create_script(jscode)
    script.on('message', on_message)
    print("[-] Running FR1DA!")
    script.load()
    sys.stdin.read()

except Exception as e:
    print(e)

위쪽 라인에서 Target에서 해당 패키지명을 찍어주고
위의 스크립트가 잘실행하는 것을 확인하기 위해 try이후에 print가 찍히면된다.

패키지 pid를 확인했을 때 둘이 잘 맞으면 스크립트 실행이 잘된것이다.(패키지명 오타도 없다는것이다)

다음은 js스크립트를 작성할 것이다. 해당 스크립트 작성할때는 다음 규칙을 따르면된다.
Java.perform(function() {   code  }); .

    Java.perform(function() {
        var exitClass = Java.use("java.lang.System");
        exitClass.exit.implementation = function() {
            console.log('[*] System.exit 함수 후킹 성공!');
        }
    });

위의 루트 우회를 작성할때 exitClass.exit implementation= function 코드가 답이다.
그리고 해당 상태로 스크립트 실행하면 다음처럼 루팅이 우회되는 것을 확인할 수 있다.

여기서 implementation란 Method에 대해서 새롭게 작성하는 것이다 즉 exit를 공백으로 만들어준다를 통해서 해당 함수가 실행되지 못하게 하는것이다.

자주쓰는 Method에 대해 아래와 같다.(https://cha3m.tistory.com/90)

var myClass = Java.use(com.mypackage.name.class)
#앱에서 사용하는 클래스와 연동되는 myClass를 정의한다.

var myClassInstance = myclass.$new();
#myClass를 통해 객체 인스턴스 생성 및 정의를 한다.

var result = myClassInstance.myMethod("param")
#클래스 내부에 있는 메소드에 접근해 인자 값을 넘겨주고 해당 결과 값을 result에 받는다.

myClass.myMethod.implementation = function(param) {
#앱에서 정의된 메소드의 구현 내용을 재작성 한다.
}

 

하지만 문제가 여기서 끝이 아닌 글을 입력하고 서치를 하면 다음이 나오기에 더 풀어야한다. 그러기에 다음글에서 다음문제를 풀어보도록하자.

 

반응형