Self-Improvement
[DIVA] 2. HardCoding Issues - Part 1 (ACCESS() 메소드 spawn 후킹 기초) 본문
정보
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!"이 출력된다.