Veloideu - IT∽보안∽프로그래밍
article thumbnail

연구 한 이유

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'));

0x104fd5af0 Jailbreak 탐지 확인

[*] 추적 모듈

위에 코드에 아래처럼 모듈 찾기

 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등 스트링값으로 검색도 가능합니다. (난독화 미적용 시 )

모듈 ida로 열어서 확인

 

아까 포인터를 찾은 부분을 찾아가면, 바로 return 값을 뱉어주는것을 확인할 수 있습니다.

[*] ARMconverter 참고

[*] ida ret는 함수가 끝날때만 실행되고, 함수 결과는 무조건 x0레지스터에 저장된다.

[*] mov x1, x0 이었는데 공부용으로 mov x1, x1로 바꾼거임 !!

MOV X1, X0 [패치전]
MOV X0, #0 리턴 값 변경

 

https://armconverter.com/?disasm&code=01%2000%2080%20d2%0A00%2000%2080%20d2  에서 IDA ARM 확인 가능

 

armconverter

 

armconverter.com

mov 리턴값 바꾸기전 확인

 

변경 후 실행 시 정상적으로 Jailbreak bypass가 되는 것을 확인할 수 있습니다.

 

 

 

참고:

https://hyotwo.tistory.com/133

'🍎IOS' 카테고리의 다른 글

IOS 앱위변조 / 복호화 IPA 서명  (0) 2022.10.19
profile

Veloideu - IT∽보안∽프로그래밍

@Veloideu

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!