1. 실습 환경
(1) 삼성 갤럭시 S7 : 버전(안드로이드 8.0), 루팅상태, frida-server 실행,
(2) windows 10 pro : frida 설치, python 3.8(64bit)
(3) APP 파일 : Uncrackable-Level1.apk
2. 코드 분석
앱을 실행결과 루팅 탐지 및 차단을 하고 있다.
코드 분석 도구인 JEB를 이용하여 코드를 분석한다.
MainActivity 확인 결과 if문을 이용하여 루팅 및 디버깅 탐지하고 있는것을 확인하였다.
onCreate 함수에서 참이면 a함수를 실행한다.
그 결과 Root detected! 스트링 문자와 This in unacceptable. The app is now going to exit. 스트링 문자가 출력되며 OK 버튼 클릭시 onClick 함수를 실행하여 앱을 종료한다.
우회 방법은 앱이 종료되지 않도록 우회를 시도해 보도록 한다.
다양한 방법중 Frida Hooking 기법을 이용하여 우회를 시도하겠습니다.
3. Frida Hooking 코드 작성
System.exit 함수가 호출되면 앱이 종료되기 때문에 System.exit 함수가 호출될 때 함수를 Hooking하여 앱이 종료되지 않도록 한다.
import frida, sys
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
PACKAGE_NAME = "owasp.mstg.uncrackable1"
jscode= """
setImmediate(function(){
Java.perform(function(){
console.log("[*] Hooking System.exit");
var exitBypass = Java.use("java.lang.System");
exitBypass.exit.implementation = function() {
console.log("[*] System.exit Success");
}
})
});
"""
try:
print('[*] By Daze !!!')
print('')
device = frida.get_usb_device(timeout=5)
pid = device.spawn([PACKAGE_NAME])
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 Hook')
script.load()
sys.stdin.read()
except Exception as e:
print(e)
PACKAGE_NAME에 들어가는 패키지 이름은 frida-ps -U를 이용하여 코드가 실행될 앱 패키지 이름을 확인하여 작성한다.
4. Frida Hooking 코드 실행
후킹 코드가 설치된 폴더경로에서 CMD를 이용하여 실행한다.
실행 명령어 : python [실행파일 명].py
CMD에서 [*] Hooking System.exit 상태에서 멈추면 모바일에서 OK 버튼을 클릭한다.
앱이 종료 되지 않고 알림창만 종료된 것을 확인할 수 있다.
5. [참고] frida 파이썬 바인딩
(1) 프로세스 식별하고 연결
(2) 연결된 디바이스에서 구현하려는 프로세스 세션 연결
(3) 자바 스크립트로 작성된 페이로드 자동 삽입
[프로세스 실행 상태에서 자바스크립트 후킹을 실행하는 코드]
import frida, sys //frida, sys 모듈 가져오기
jscode= """paylod_code""" //삽입할 자바스크립트 코드 넣기
try:
session=frida.get_usb_device().attach("com.your.package.name") //frida를 시작하고 USB 장치에서 com.your.package.name 프로세스 연결
script=session.create_script(jscode) //jscode에 있는 스크립트 코드를 frida에서 사용할 수 있도록 생성)
script.load() //생성한 script를 로드
sys.stdin.read() //script가 동작하기 전에 종료되는 문제 예방
except Exception as e:
[메인 쓰레드가 시작되기 전에 자바스크립트 코드 후킹을 실행하는 코드]
import frida, sys //frida, sys 모듈 가져오기
jscode= """paylod_code""" //삽입할 자바스크립트 코드 넣기
try:
device=frida.get_usb_device() //frida를 시작하고 USB장치에 연결
pid=device.spawn(['com.your.package.name']) //연결된 USB장치에서 com.your.package.name 프로세스 생성
session=frida.get_usb_device().attach(pid) //frida를 시작하고 USB 장치에서 com.your.package.name 프로세스 연결
script=session.create_script(jscode) //jscode에 있는 스크립트 코드를 frida에서 사용할 수 있도록 생성
script.load() //생성한 script를 로드
device.resume(pid) //com.your.package.name 프로세스 메인 스레드 실행
sys.stdin.read() //script가 동작하기 전에 종료되는 문제 예방
except Exception as e:
6. [참고] frida 파이썬 바인딩 메시지 처리
console.log()는 콘솔 화면에 바로 출력
send()는 스크립트로 전달하여 데이터 처리, 파이썬 스크립트를 통해 데이터를 전달하고, 제어하여 처리할 수 있다.
send(message, [data]) //frida 기반 애플리케이션에 자바스크립트 객체 massage 전송
script.on('message', on_message) //frida script에서 보낸 메시지를 처리할 callback 함수를 설정, 호출 할 handler를 등록하는 과정
on_massage(message, data) // script.on('message', on_message)에서 등록한 핸들러에 대한 정의, 단순히 message 매개변수를 콘솔에 출력하는 역할
'보안 > Mobile_APP' 카테고리의 다른 글
[APP Hooking] Android 모바일 앱(UnCrackable-Level2.apk) 후킹_Level2 (0) | 2020.12.04 |
---|---|
[앱 진단] 모바일 애플리케이션 보안 취약점 점검(디바이스 진단) (0) | 2020.08.11 |