[해킹보안] 창과 방패 끝없는 전쟁

이번 문제는 Jailbreak Test3 문제를 풀어 보았다.

 

일단 아이폰 내 설치 된 응용 프로그램 중, Jailbreak Test3 탭을 누르면 아래와 같은 팝업 창이 뜬다.

 

우선 응용 프로그램에서 어떤 기능이 사용되는지 확인하기 위해서 아래와 같은 명령을 사용하여 추적을 시작했다.

 

frida-trace -U -i "*jail*" DVIA-v2 명령을 실행 , 응용프로그램 jailbreak test3 탭을 누름

 

그러면 버튼을 클릭할 함수를 호출한다. 그래서 Jailbreak Test3 버튼을 클릭 _T07DVIA_v232... Jailbreak Test1TappedypF 호출된다.

 

이제 함수가 진행되는 것을 확인하고 BL(분기 링크) 명령으로 다른 함수를 호출했다. 이것은 기본적으로 JMP명령과 동일하다.

 

호출되는 명령은 아래와 같다.

 

이제 frida 사용해서 Script 작성하고 hooking하려는 명령이 실제로 호출되고 있는지 확인했다.

checkmeminuse.js 스크립트

 

 

응용 프로그램에 대해 대상 모듈을 변경해야 했다. 모듈베이스는 정적이며 frida 자동으로 오프셋을 계산한다.

 

frida -U -l checkmeminuse.js DVIA-v2 명령을 실행 시킨 , Jailbreak Test 3탭을 누르면 메모리 주소가 사용 중이라는 것을 있었다. (아이폰 화면에 Jailbreak Test3 버튼을 눌러도 동작하지 않음)

 

이제 x8 레지스터에 로드되는 값이 무엇인지 알기 위해 아래와 같이 스크립트를 짰다.

Hook3-1

 

 

이는 주소를 출력하는 함수의 변경과 x0 레지스터 내에서 반환되는 값과 동일하다.

 

아래 frida 명령으로 후킹을 했다.

 

frida -U -l hook3-1.js DVIA-v2

이제 응용 프로그램 내에서 실행할 있다. 그리고 주소값 확인할 수 있었다.

 

따라서 주소가 찾았고 x0 레지스터의 값이 1이라는 것을 알게 됐다. 이렇게 해서 번째 함수가 일부 검사를 수행했으며, Return 결과는 탈옥에 대해 1 또는 탈옥되지 않은 경우 0으로 나타난다는 것을 알았다. 그러면 비교를 위해 x8 로드되어 어떤 팝업이 올라올지 분석해 보았다.

 

다음으로 메모리 주소를 가로 채고, x0 레지스터의 값이 0x01인지 확인한 , 만약 그것이, 다음 0x0으로 변경되면 콘솔을 통해 “Bypass Test3”이라고 출력할 것이다.

 

frida -U -l DVIA2bypassjailbreak1.js DVIA-v2 명령을 실행하였다.

DVIA2bypassjailbreak3.js 스크립트

 

 

 

 

Script가 정상 실행 되었으며, 콘솔 창에 Bypass Test3이라고 출력 됨.

 

 

그런 다음 jailbreak test3 탭을 누르면 팝업 창에 Device is Not Jailbroken이란 메시지가 뜨면서 탈옥탐지를 우회할 있었다.

 

-          -

 

[참고 사이트]

https://philkeeble.com/ios/reverse-engineering/iOS-Bypass-Jailbreak/

 

Bypassing JailBreak Detection - DVIAv2 Part 2

A guide on how to bypass jailbreak detection on the DVIAv2 app for iPhones.

philkeeble.com

https://frida.re