앞서 Cycript의 메소드 스위즐링으로는 -[JailbreakDetectionVC jailbreakTest2Tapped:] 함수를 쉽게 우회하지 못했다.
-[JailbreakDetectionVC jailbreakTest2Tapped:]
[어셈블리 명령어 분석]

코드를 보면
[[NSFileManager defaultManager] fileExistAtPath:@"탈옥 관련 파일"]
NSFileManger 클래스의 인스턴스 메소드인 fileExistsAtPath 함수를 통해 탈옥 관련 파일 존재여부를 판단하고 분기문을 타는 것을 볼 수 있다.
이는 파일시스템 기반 검사에 해당한다.
- /Applications/Cydia.app
- /Library/MobileSubstrate/MobileSubstrate.dylib

역시 파일 시스템 기반 검사가 이어진다.
- /bin/bash
- /usr/sbin/sshd
- /etc/apt

이 부분은 샌드박스 무결성 검사에 해당한다.
샌드박스 바깥 경로에 파일을 생성할 수 있는지 여부를 보고 판단한다.
정상적인 앱이라면 샌드박스로 권한이 제한되어 /private/ 경로 아래에 파일을 생성할 수 없다.
- /private/jailbreak.txt 파일 생성 가능 여

[@"This is a test" writeToFile:@"private/jailbreak.txt" automatically:1 encoding:4 error:&error];
automatically는 Auxiliary file에 저장할 지 여부를 설정하는 것.
encoding 4번은 NSUTF8StringEncoding에 해당한다.

마지막으로 cydia:// 스키마 검사를 하는 것으로 탈옥탐지 검사가 완료된다.
//cydia scheme 검사 [NSURL URLWithString:@"cydia://package/com.example.package"];
코드패치
분석을 해서 알겠지만, 맨 마지막에 메세지를 띄우는 함수의 인자로 전달되는 JB_exist(내가 임의로 명명한 변수)의 값에 따라 탈옥 여부가 판단된다.
따라서 앞에껀 다 그대로 탐지하라고 두고, 맨 마지막에만 JB_exist로 전달되는 값이 0이 되도록 패치하면 된다.

ida에서는 일반적으로 하듯 코드패치를 진행하면 되고, 이번에는 Hopper 디스어셈블러를 이용해서 항상 0을 인자로 넘기도록 코드를 패치하였다.

수정한 내용을 포함한 전체를 바이너리로 뽑아냈다.

기존의 바이너리의 이름을 바꾸고, 패치한 바이너리로 대체하였다.
물론 파일전송을 하면 기본적으로 실행권한이 없으므로 아래 명령어로 실행권한을 주어야 한다.
chmod +x DamnVulnerableIOSApp

코드패치한 바이너리가 잘 동작하면서, 탈옥탐지를 우회에 성공하였다.
아쉬운 점 : 아래 그림처럼 탈옥 감지를 할 때마다 종료된다면 코드를 여러번 수정하도록 강요할 수 있었을텐데, 결국 마지막 코드 한줄만 바꾸면 되는 경우라는 아쉬움이 있다.

다음은
다음은 바이너리를 패치하지 않고 후킹 트윅을 제작하여 자동으로 우회하도록 만들어 보자.
DVIA - Jailbreak 우회 3 (Tweak)