Self-Improvement

[DIVA] 2. HardCoding Issues - Part 1 (ACCESS() 메소드 spawn 후킹 기초) 본문

AOS/DIVA

[DIVA] 2. HardCoding Issues - Part 1 (ACCESS() 메소드 spawn 후킹 기초)

JoGeun 2021. 10. 21. 21:31

정보

DIVA 앱을 실행하면 Hardcoding Issues 액티비티에 접근할 시 입력할 수 있는 것과 ACCESS 버튼이 존재한다.

 

 

아무 값이나 입력한 후 ACCESS 버튼을 클릭할 시 아래와 같이 문구가 출력된다.

해당 ACCESS 버튼을 눌렀을 시 실행되는 메소드를 찾아 후킹을 걸어보자.

 

JADX 프로그램에 DIVA APK 파일을 올린다.

그리고 Text Search를 통해 ACCESS 버튼을 눌렀을 시 출력되던 "Access denied! See you in hell :D" 문구를 찾아본다.

총 2가지가 나오기에 하나의 메소드를 타겟으로 먼저 해본다.

 

HardcodeActivity 액티비티를 확인한 후 먼저 실행되는 onCreate 메소드에서 R.layout.activity_hardcode를 setContentView를 하고 있다.

 

res 폴더에서 activity_hardcode.xml 파일을 확인해보면 버튼이 존재한다.

 

access 메소드에 의해 실행되는 것을 알 수 있으며

각 객체의 셋팅된 문자열 값도 확인할 수 있다. resources.arsc(아스키)의 res - values의 strings.xml에서 확인할 수 있다.

 

후킹

이제 다시 본론으로 와서 access 메소드를 후킹해보는데 base 코드는 아래와 같다.

import frida, sys

Hook_package = "owasp.mstg.uncrackable1"
# Hooking 하는 대상 패키지 이름(앱의 본명)은 여기에 적습니다.
# 패키지 이름은 nox_adb shell 로 접속 후 pm list packages 또는 astro에서 백업 등을 통해 확인 가능합니다.

# ex) send("[*] Injected JS"); 하면 출력됨
def on_message(message, data):
    print("{} -> {}".format(message, data))

# 후킹 코드
jscode = """
    Java.perform(function() {
        var exitClass = Java.use("java.lang.System");
        exitClass.exit.implementation = function() {
            console.log('[*] System.exit function hooking Success!');
        }
    });
"""

try:
# 작성된 후킹 스크립트 코드 로드 후 프로세스에 연결까지 한 번에..!
    device = frida.get_usb_device(timeout=10)
    pid = device.spawn([Hook_package]) # spawn으로 앱을 후킹하고 실행하는 방식
    print("App 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)

 

위의 코드를 뼈대로 하여 작성하면 아래와 같다.

DIVA 앱의 패키지명과 후킹을 할 access 메소드의 액티비티 경로를 작성해주면 된다.

import frida, sys

Hook_package = "jakhar.aseem.diva"


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


jscode = """
    send("[*] Injected JS");
    Java.perform(function() {
        var target = Java.use("jakhar.aseem.diva.HardcodeActivity");
        target.access.implementation = function(arg1){
            console.log("Function called!");
            var ret = this.access(arg1);
            return ret
        }
    });
"""

try:

    device = frida.get_usb_device(timeout=5)
    pid = device.spawn([Hook_package])
    print("App 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)

 

그리고 python으로 실행해주면 앱이 실행되고 ACCESS 버튼을 클릭할 시 콘솔에 "Function Called!"이 출력된다.