DVIA - Jailbreak 우회 2 (코드패치)

 
DVIA - Jailbreak 우회 1 (Cycript)
앞서 Cycript의 메소드 스위즐링으로는 -[JailbreakDetectionVC jailbreakTest2Tapped:] 함수를 쉽게 우회하지 못했다.
 

-[JailbreakDetectionVC jailbreakTest2Tapped:]

[어셈블리 명령어 분석]

notion image
코드를 보면
[[NSFileManager defaultManager] fileExistAtPath:@"탈옥 관련 파일"]
NSFileManger 클래스의 인스턴스 메소드인 fileExistsAtPath 함수를 통해 탈옥 관련 파일 존재여부를 판단하고 분기문을 타는 것을 볼 수 있다.
이는 파일시스템 기반 검사에 해당한다.
  • /Applications/Cydia.app
  • /Library/MobileSubstrate/MobileSubstrate.dylib
 
notion image
역시 파일 시스템 기반 검사가 이어진다.
  • /bin/bash
  • /usr/sbin/sshd
  • /etc/apt
 
notion image
이 부분은 샌드박스 무결성 검사에 해당한다.
샌드박스 바깥 경로에 파일을 생성할 수 있는지 여부를 보고 판단한다.
정상적인 앱이라면 샌드박스로 권한이 제한되어 /private/ 경로 아래에 파일을 생성할 수 없다.
 
  • /private/jailbreak.txt 파일 생성 가능 여
notion image
[@"This is a test" writeToFile:@"private/jailbreak.txt" automatically:1 encoding:4 error:&error];
automatically는 Auxiliary file에 저장할 지 여부를 설정하는 것.
encoding 4번은 NSUTF8StringEncoding에 해당한다.
 
notion image
마지막으로 cydia:// 스키마 검사를 하는 것으로 탈옥탐지 검사가 완료된다.
//cydia scheme 검사 [NSURL URLWithString:@"cydia://package/com.example.package"];
 

코드패치

분석을 해서 알겠지만, 맨 마지막에 메세지를 띄우는 함수의 인자로 전달되는 JB_exist(내가 임의로 명명한 변수)의 값에 따라 탈옥 여부가 판단된다.
 
따라서 앞에껀 다 그대로 탐지하라고 두고, 맨 마지막에만 JB_exist로 전달되는 값이 0이 되도록 패치하면 된다.
 
notion image
ida에서는 일반적으로 하듯 코드패치를 진행하면 되고, 이번에는 Hopper 디스어셈블러를 이용해서 항상 0을 인자로 넘기도록 코드를 패치하였다.
 
notion image
수정한 내용을 포함한 전체를 바이너리로 뽑아냈다.
 
notion image
기존의 바이너리의 이름을 바꾸고, 패치한 바이너리로 대체하였다.
물론 파일전송을 하면 기본적으로 실행권한이 없으므로 아래 명령어로 실행권한을 주어야 한다.
chmod +x DamnVulnerableIOSApp
 
notion image
코드패치한 바이너리가 잘 동작하면서, 탈옥탐지를 우회에 성공하였다.
 
아쉬운 점 : 아래 그림처럼 탈옥 감지를 할 때마다 종료된다면 코드를 여러번 수정하도록 강요할 수 있었을텐데, 결국 마지막 코드 한줄만 바꾸면 되는 경우라는 아쉬움이 있다.
notion image
 

다음은

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