Search

Hooking을 통한 루팅감지 회피, 키 값 추출 (Uncarkable1)

카테고리
[실습] 모바일 앱 공격 위협
상태
완료
게시일
2024/05/10
태그
hooking, 모바일, 안드로이드

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을 이용하여 키 값 추출 성공