연구 한 이유
IOS 앱위변조 -> 사용자 코드 변경 후 비정상적인 작동
/* 설명
1) jailbreak 우회 -> 앱 정상실행
2) FileExistsAtPath 우회 -> 앱 정상실행
*/
Frida를 통한 Jailbreak 우회
Frida Jailbreak
1. frida 설치
2. frida 후킹 코드 실행
3. 우회 완료
[*] Hook
[*] frida -U --no-pause -f [App Name] -l [File Name]
if (ObjC.available) {
var paths = [
"/Applications/blackra1n.app",
"/Applications/Cydia.app",
"/Applications/FakeCarrier.app",
"/Applications/Icy.app",
"/Applications/IntelliScreen.app",
"/Applications/MxTube.app",
"/Applications/RockApp.app",
"/Applications/SBSetttings.app",
"/Applications/WinterBoard.app",
"/bin/bash",
"/bin/sh",
"/bin/su",
"/etc/apt",
"/etc/ssh/sshd_config",
"/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist",
"/Library/MobileSubstrate/DynamicLibraries/Veency.plist",
"/Library/MobileSubstrate/MobileSubstrate.dylib",
"/pguntether",
"/private/var/lib/cydia",
"/private/var/mobile/Library/SBSettings/Themes",
"/private/var/stash",
"/private/var/tmp/cydia.log",
"/System/Library/LaunchDaemons/com.ikey.bbot.plist",
"/System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist",
"/usr/bin/cycript",
"/usr/bin/ssh",
"/usr/bin/sshd",
"/usr/libexec/sftp-server",
"/usr/libexec/ssh-keysign",
"/usr/sbin/frida-server",
"/usr/sbin/sshd",
"/var/cache/apt",
"/var/lib/cydia",
"/var/log/syslog",
"/var/mobile/Media/.evasi0n7_installed",
"/var/tmp/cydia.log"
];
var f = Module.findExportByName("libSystem.B.dylib", "stat64");
Interceptor.attach(f, {
onEnter: function(args) {
this.is_common_path = false;
var arg = Memory.readUtf8String(args[0]);
for (var path in paths) {
if (arg.indexOf(paths[path]) > -1) {
this.is_common_path = true;
//return -1;
}
FileExistsAtPath
}
},
onLeave: function(retval) {
if (this.is_common_path) {
console.log("stat64 Bypass!!!");
retval.replace(-1);
}
}
});
var f = Module.findExportByName("libSystem.B.dylib", "stat");
Interceptor.attach(f, {
onEnter: function(args) {
this.is_common_path = false;
var arg = Memory.readUtf8String(args[0]);
for (var path in paths) {
if (arg.indexOf(paths[path]) > -1) {
console.log("Hooking native function stat: " + arg);
this.is_common_path = true;
//return -1;
}
}
},
onLeave: function(retval) {
if (this.is_common_path) {
console.log("stat Bypass!!!");
retval.replace(-1);
}
}
});
}
[*] 결과
IDA 바이너리 패치
먼저 오프셋 및 포인트를 찾기 위해 위에 hook코드에 backtrace를 추가해서 추적합니다.
[*] backtrace 코드
console.log("Hooking native function stat64: " + arg);
console.log('\tBacktrace:\n\t' + Thread.backtrace(this.context,Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\n\t'));
[*] 추적 모듈
위에 코드에 아래처럼 모듈 찾기
var f = Module.findExportByName("libSystem.B.dylib", "stat64");
Interceptor.attach(f, {
onEnter: function(args) {
this.is_common_path = false;
var arg = Memory.readUtf8String(args[0]);
const base = Module.findBaseAddress('이름');
console.log('* 이름offset:', base);
이제 찾은 offset에서 backtrace코드를 빼면 jailbreak 포인터가 잡힙니다.
포인터 보기 전 백트레이스 찍은 부분에서 [모듈]을 확인할 수 있습니다. 그 파일을 ida로 열어야합니다.
경로 : [앱]\Frameworks\[탐지].framework
ida 열면 Cydia등 스트링값으로 검색도 가능합니다. (난독화 미적용 시 )
아까 포인터를 찾은 부분을 찾아가면, 바로 return 값을 뱉어주는것을 확인할 수 있습니다.
[*] ARMconverter 참고
[*] ida ret는 함수가 끝날때만 실행되고, 함수 결과는 무조건 x0레지스터에 저장된다.
[*] mov x1, x0 이었는데 공부용으로 mov x1, x1로 바꾼거임 !!
https://armconverter.com/?disasm&code=01%2000%2080%20d2%0A00%2000%2080%20d2 에서 IDA ARM 확인 가능
armconverter
armconverter.com
변경 후 실행 시 정상적으로 Jailbreak bypass가 되는 것을 확인할 수 있습니다.
참고:
'🍎IOS' 카테고리의 다른 글
IOS 앱위변조 / 복호화 IPA 서명 (0) | 2022.10.19 |
---|