[목차]
1. DVIA - Jailbreak Test 2
2. 스크립트 참고
3. 대응방안
1. DVIA - Jailbreak Test 2
# 작업 절차
: Objective-C로 작성된 클래스 메소드를 프리다로
1) 클래스 추출
2) 메소드 추출
3) 반환 값 확인 후 변조
1) Test 2 클릭 시 탈옥 탐지 팝업 확인
2) 프리다로 실행중인 앱의
- 프로세스 아이디 (PID)
- 앱 이름(번들 ID)
- 식별자 확인
$ frida-ps -Ua //ps=process, -U=USB 연결된 디바이스, a=application info >> 현재 실행중인 앱 확인
다음으로 현재 실행 중인 앱에
로드 되어있는 class들을 확인해본다.
3) 코드 작성
3-1) 전체 class 호출 후
탈옥 탐지 class 찾기 위한 코드!
if(ObjC.available){ // 해당 코드가 실행 가능한 환경이라면,
for(var classname in ObjC.classes) // ObjC.classes > 메모리에 올라와 있는 오브젝트 맵핑 클래스 모두 픽!
console.log(classname)
}
프리다로 파일 로드 후 살펴본다.
방법 1. 키워드 검색
$ frida -U -l "c:\somewhere\jailBreak_test2.js" DVIA-v2 | find "Jail" // 대소문자 구분함!
방법 2. 검색된 클래스들 모두 파일에 저장 후 메모장에서 검색
$ frida -U -l "c:\somewhere\jailBreak_test2.js" DVIA-v2 > classes.txt
둘 다 돌려보면
또는
> JailbreakDetection 클래스 존재 확인!
3-2) 해당 클래스의 메소드 확인 코드
if(ObjC.available){
var classname = "JailbreakDetection"
var methods = ObjC.classes[classname].$ownMethods
// ObjC.classes[classname] = JailbreakDetection 클래스에 대한 정보를 가져온 뒤
// .$ownMethods 속성을 줌으로 JailbreakDetection의 메소드 정보가 해당 메소드에 들어간다.
console.log(methods)
}
돌려보면
JailbreakDetection이라는 클래스가 사용하는
메소드는 "isJailbreken" 하나뿐인 것을 확인!
[참고] 메소드 앞에 + 기호가 붙는 경우는
해당 메소드가 클래스에 대한 메소드인 경우고
- 기호가 붙는 경우는 인스턴스의 메소드의 경우!
3-3) 찾은 메소드 반환 값 확인 코드
if(ObjC.available){
var classname = "JailbreakDetection" // 찾은 클래스 이름
var methodname = "isJailbroken" // 찾은 메소드 이름
var hook = ObjC.classes[classname][methodname] // 찾은 클래스, 메소드에 대한 정보를 hook 변수에 담았다
// 찾은 메소드에 대해서 Interceptor를 걸어 반환값을 확인해본다
Interceptor.attach(hook.implementation,{ // implementation 하는 이유는 해당 메소드를 실행하기 위함!
onLeave:function(retval){ // 반환값 확인할 때는 onLeave! onEnter는 콜백!
// retval = return value
// onLeave:function(retval) = 기본 구문!
console.log("[+] Class Name: "+ classname)
console.log("[+] Method Name: "+ methodname)
console.log("[+] Type of return value: "+ hook.returnType) // 반환 값의 data type 확인!
console.log("[+] Return Value: "+ retval)
console.log("[+] 클래스 명: "+ classname)
console.log("[+] 메소드 명: "+ methodname)
console.log("[+] 데이터 타입: "+ hook.returnType)
console.log("[+] 리턴 값: "+ retval)
}
}) // 코드 작성 시 괄호 주의;;
}
로드하면 아무것도 안 뜨지만
앱에서 test2 한번 눌러주면
정상 적으로 정보가 출력되고
리턴 값을 0으로 변조해 주면
탈옥 탐지 우회가 가능하겠다.
3-4) 탈옥 탐지 우회 최종 코드
if(ObjC.available){
var classname = "JailbreakDetection"
var methodname = "isJailbroken"
var hook = ObjC.classes[classname][methodname]
Interceptor.attach(hook.implementation,{
onLeave:function(retval){
console.log("[+] 클래스 명: "+ classname)
console.log("[+] 메소드 명: "+ methodname)
console.log("[+] 데이터 타입: "+ hook.returnType)
console.log("[+] 리턴 값: "+ retval)
var new_retval = ptr("0x0") // 16진수 0으로 작성을 한 뒤, 해당 값을 native pointer 형식으로 생성을 해야
// 메모리에서 정상적으로 불러들여 사용이 가능
retval.replace(new_retval) // 기존 retval 값을 새 값으로 바꿔주고
console.log("[+] 새 리턴 값: "+ retval) // 출력해본다.
}
})
}
돌려보면
정상 변조되어
탈옥 탐지 우회 성공!
2. 스크립트 참고
기본 프리다 스크립트는
구글링을 통해 쉽게 확인이
가능하며 일부 유용한 스크립트
샘플을 확인해 본다.
출처 :
https://github.com/interference-security/frida-scripts/tree/master/iOS
2-1) Find_classes.js
//Twitter: https://twitter.com/xploresec
//GitHub: https://github.com/interference-security
function run_show_classes_of_app()
{
console.log("[*] Started: Find Classes")
var count = 0
for (var className in ObjC.classes)
{
if (ObjC.classes.hasOwnProperty(className))
{
console.log(className);
count = count + 1
}
}
console.log("\n[*] Classes found: " + count);
console.log("[*] Completed: Find Classes")
}
function show_classes_of_app()
{
setImmediate(run_show_classes_of_app) // setImmediate은 단말기와 프리다의 연결 타임아웃을 방지해주는 메소드
}
show_classes_of_app()
2-2) 반환값 수정.js
//Twitter: https://twitter.com/xploresec
//GitHub: https://github.com/interference-security
function show_modify_function_args(className, funcName)
{
var hook = ObjC.classes[className][funcName];
Interceptor.attach(hook.implementation, {
onEnter: function(args) {
// args[0] is self
// args[1] is selector (SEL "sendMessageWithText:")
// args[2] holds the first function argument, an NSString
console.log("\n[*] Detected call to: " + className + " -> " + funcName);
console.log("\t[-] Argument Value: "+args[2]);
//your new argument value here
var newargval = ptr("0x0")
args[2] = newargval
console.log("\t[-] New Argument Value: " + args[2])
}
});
}
//Your class name and function name here
show_modify_function_args("className", "funcName")
3. 대응방안
[도움 및 일부 이미지출처]
: 보안프로젝트 김태영 팀장 iOS 모바일 앱 모의해킹(기초) 강의
'APP 진단 > iOS' 카테고리의 다른 글
12. Exccesive Permissions (0) | 2022.11.19 |
---|---|
11. Fairplay DRM 복호화 (2) | 2022.11.19 |
9. Jailbreak Detection 3 - 탈옥 탐지 우회 실습 1 (2) | 2022.11.16 |
8. Jailbreak Detection 2 - 프리다 기초 문법 (0) | 2022.11.15 |
7. Jailbreak Detection 1 - 환경설정 (기드라/프리다) (0) | 2022.11.15 |