0) 실습준비
•
Uncarkable1.apk 설치
•
rooting 이 감지되어 ok 버튼을 누르면 어플이 꺼져버린다
•
Hooking을 통해 이 부분부터 회피하도록 한다
1) 정적분석 시작 (jasx-gui)
MainActivity 클래스에서 "Root detected!" 문자열을 포함한 코드를 확인할 수 있었다
if 조건문 만족 시 a() 메소드가 실행 되므로 a() 메소드를 살펴본다
2) Hooking 용 .py 파일 작성
•
System.exit(0) 메소드에 의해 종료되지 않기 위해서 해당 함수를 Hooking 한다
import frida, sys
jscode = """
setImmediate(function(){
Java.perform(function() {
console.log("[*] Hooking System.exit()");
var exitBypass = Java.use("java.lang.System");
exitBypass.exit.implementation = function() {
console.log("[*] Hooking Success");
}
})
});
"""
device = frida.get_usb_device(1)
process = device.attach("Uncrackable1")
print(process)
script = process.create_script(jscode)
script.load()
sys.stdin.read()
Python
복사
•
위와 같이 System.exit 함수를 재정의하여 "OK" 버튼을 눌렀을 때 콘솔창에 "Hooking Success" 가 출력되도록 변조한다
3) rooting 감지 회피 확인
•
Hooking 용 파이썬 파일을 실행하여 rooting 감지를 회피한다
•
콘솔창 출력과 함께 프로그램이 종료되지 않았다
rooting 감지 회피 성공
4) key 값 출력 함수 분석
이제 key 값을 얻어야하니 해당 부분을 분석한다
입력한 key 값을 검증하는 것으로 보이는 verify 메소드에서
"Success!" 문자열이 포함된 구문을 확인했다<br>
해당 구문의 조건을 확인하기위해 a.a() 메소드를 분석한다
a.a() 메소드 확인
sg.vantagepoint.a.a.a() 함수를 통해 복호화한 데이터를 파라미터 str과 비교하여 일치여부를 boolean 타입으로 return 해주고 있다<br>
복호화한 데이터와 같은지 비교한다는 점에서 파라미터 str은 사용자가 입력한 값이라고 추측할 수 있다<br>
그렇다면 sg.vantagepoint.a.a.a() 분석하여 어떻게 동작하는지 확인한다
sg.vantagepoint.a.a.a() 분석
해당 함수는 파라미터 2개를 받아 복호화를 실제로 진행하는 것을 확인하였다
해당함수를 사용하여 콘솔창에 해당값을 출력할 수 있게 할 예정이다
5) Hooking 용 .py 파일 작성
•
this.a(arg1, arg2) 를 사용하여 인자를 그대로 가녀와 콘솔에 출력
import frida, sys
jscode = """
setImmediate(function() {
Java.perform(function() {
console.log("[*] Hooking start");
var verifyBypass = Java.use("sg.vantagepoint.a.a");
verifyBypass.a.implementation = function(arg1, arg2) {
console.log("[*] Hooking Success");
var secret = this.a(arg1, arg2);
console.log(secret);
}
})
});
"""
process = frida.get_usb_device(1).attach("Uncrackable1")
print(process)
script = process.create_script(jscode)
script.load()
sys.stdin.read()
Python
복사
•
복호화된 데이터가 ASKII 코드로 출력되는 것을 확인할 수 있다
6) ASKII 코드 변환
•
Hooking 을 통해 얻은 ASKII 코드 데이터를 String.fromCharCode() 메소드를 사용하여 문자로 변환하여 출력한다
import frida, sys
jscode = """
setImmediate(function() {
Java.perform(function() {
console.log("[*] Hooking start()");
var secret = Java.use("sg.vantagepoint.a.a");
secret.a.implementation = function(arg1, arg2) {
var secret_bytes = this.a(arg1, arg2);
var secret_string = "";
for (var i = 0; i < secret_bytes.length; i++) {
secret_string += String.fromCharCode(secret_bytes[i]);
}
console.log("Decrypted String: " + secret_string);
}
});
});
"""
process = frida.get_usb_device(1).attach("Uncrackable1")
print(process)
script = process.create_script(jscode)
script.load()
sys.stdin.read()
Python
복사
7) 결과 확인
•
해당 파이썬 파일 실행 후 어플에서 "VERIFY" 버튼을 누르게 되면 기존 키 값이 출력되는 것을 확인할 수 있다
•
다시 어플을 실행 후 해당 구문을 입력하여 버튼을 누르면 "Success!" 메세지를 확인할 수 있다!
Hooking을 이용하여 키 값 추출 성공