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

 

 

 


24
시간 365 문 여는 무인 반려동물 용품점  관악구 청림동에 

3 중순 오픈 예정입니다먼저 위치 안내해 드릴께요

 

우성, 관악 푸르지오 아파트를 비롯한 주변에 사시는 모든 반려견과 반려묘를 키우시는 분들에게 정말 반가운 소식이 아닐까 싶습니다

 

위치 : 청림동 관악 식자재마트 & 다이소 맞은편 (관악구 청림길 16-3)

(원래 야채가게 였고   철거 공사가 시작됩니다) 두근두근

 어떻게 변한 모습으로 찾아뵐지 저도 궁금하네요조금만 기다려 주세요

 

 

 

 

씨유펫 관악점 : 네이버 블로그

밤 늦었는데 울댕댕이 용품 똑 떨어졌네. 어디서 사지? & 울냥이 물건을 직접 만져보고 확인하고 사고 싶은데->이런 견주와 집사를 위한 안성맞춤 365일 24시간 열려있는 무인 반려동물 용품점, 씨

blog.naver.com

 

iOS 단말기에 설치되어 있는 Jailbreak Test1 클릭하면 

아래와 같은 팝업 창이 표시된다.

 

Device is Jailbroken

 

 

Start point 찾기 위해 frida Attach하여 UI Dump 수행 .

 

DVIA_v2.JailbreakDetectionViewController Class 분석의 기준 점으로 선정 .

 

IDA Pro에서 DVIA_v2.JailbreakDetectionViewController 검색 ,

-[DVIA_v2.JailbreakDetectionViewController jailbreakTest1Tapped:] Method 클릭하여 분석을 진행 .

 

 

Method 내에서 "Device is Jailbroken" 알람 창을 띄우는 Logic 딱히 보이지 않음

BL(Branch with Link)    __T07DVIA_v232JailbreakDetectionViewControllerC20jailbreakTest1TappedyypF

지시어가 의심스러우므로 클릭하여 진입

 

__T07DVIA_v232JailbreakDetectionViewControllerC20jailbreakTest1TappedyypF 함수 내에서도 직접적으로 알람 창을 띄우는 로직은 보이지 않음. 그러나, 많은 B(Branch) 지시어가 보이므로 lldb 동적 디버깅의 시작점으로 삼기에 적합

※ lldb 디버깅 환경 구성https://hackcatml.tistory.com/46

 

lldb 로 DVIA-v2 프로세스에 attach하게 되면 앱 프로세스가 중단됨

c 명령어로 프로세스를 resume 시켜줌

 

그 후 다음 명령어로 디버깅 하고자 하는 함수의 주소에 breakpoint 설정

br s -a 0x<ASLR Offset>+0x<IDA Pro에서 함수의 시작주소>

 

분석하고자 하는 함수의 주소 값은 다음 절차를 통하여 구함

 

image dump sections <appName>

 ASLR Offset = 0x((노란 박스) - (파란 박스))

예컨데, ASLR Offset이 0x488000이고, IDA Pro에서 함수의 시작주소가 0x100192C10이라면 

 br s -a 0x488000+0x100192C10 으로 브레이크포인트 설정

브레이크 포인트 설정 후 화면의 Jailbreak Test1을 탭하게 되면 breakpoint를 hit하게 됨

 

 

 

이제, n(Next, Step Over) 명령어로 arm 지시어를 하나씩 넘기면서 관찰을 진행

쭉 진행하다 의심스러운 blr(Branch with Link to Register) 지시어를 만난 경우, register read 명령어로 어디로 branch 되는지 확인. "~ -> Swift.Bool"이라고 나오는데, 알람창 띄우는 것이랑 관련 없어 보이므로 Pass.

 

다시, n으로 진행하면 의심스러운 blr 지시어를 만나는데, register read 명령어를 수행하면 알람창 띄우는 것과 관련된 함수로 이동하는 것을 알 수 있음. s(Step In) 명령어로 branch된 함수 내부로 진입

 

함수 디버깅을 시작하기 전에, IDA Pro에서 그 함수가 어떤 형식으로 구성되었는지 살펴 보는게 도움되므로, "showAlert"을 검색. IDA Pro 에서는 함수이름이 알아보기 어렵게 표시되어 있는데, 이는 Swift Name Mangling 때문으로, xcrun 명령어를 사용하면 demangling 된 함수이름을 얻을 수 있음

함수 내부를 살펴보면 TBZ(Test bit and Branch if Zero) 지시어에서 분기가 이루어져서 "Device is Jailbroken" 또는 "Device is Not Jailbroken"을 출력하는 것을 알 수 있음

 

목표는 lldb 명령어로 TBZ 지시어로 이동한 다음 register 값을 변경하여 분기 흐름을 변경시켜주는 것임

 

위 그림과 같이 TBZ 지시어에서 w0 레지스터의 값을 읽으면 1인 것을 알 수 있음. 따라서, 이대로 진행하게 되면 "Device is Jailbroken"이 출력되는 것이므로 w0 레지스터의 값을 0으로 변경

 

이제, c명령어로 모든 process 를 resume시키게 되면 "Device is Not Jailbroken" 알람창이 뜨는 것을 확인 가능

 

** 구글 검색을 통해 Jailbreak test1을 풀던 중, 상기 빨간색으로 칠한 글자부터 더 이상 진행이 힘들어서(mangling decode 문제) frida hooking 기술을 통해 문제를 해결 함 **

 

 

 

 

-      아래 페이지 계속 -

 

 

 

Jailbreak Detection Bypass

Jailbreak Test1

frida를 통해서 어떤 기능이 사용되는지 추적을 했다.

frida-trace -U -i "*jail*" DVIA-v2

참고: 테스트 장치는 USB 위에 연결되어 있어야 하며, DVIA-v2가 실행되어야 함.

버튼을 클릭할 때 마다 각 함수를 호출한다. 그래서 Jailbreak Test1 버튼을 클릭 할 때 첫 번째 기능인 (_T07DVIA_v232... Jailbreak Test1TappedypF)를 불러온다. 응용 프로그램을 로드하고 test 1의 첫 번째 함수를 찾았다.

함수가 실제 수행하는 작업을 분석했다. 전체 기능은 아래와 같다.

함수가 진행되는 것을 확인하고 BL(분기 링크) 명령으로 다른 함수를 호출했다.

이것은 기본적으로 JMP명령과 동일하다. 함수에 마우스를 가져 가면 해당 어셈블리도 볼 수 있다.

 

__T07DVIA_v213DVIAUtilitiesCMa

__T07DVIA_v213DVIAUtilitiesCMa

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

 

첫 번째 명령은 참조되는 SP 레지스터 내에서 값을 로드하는 것이다. x8 레지스터에 로드된다. 그리고 값이 x0 레지스터에 기록 되었다. 이후 명령 값을 x8에서 x0으로 이동. 그런 다음 다른 함수에 대한 명령을 받고 그 후 닫힌다. 따라서 x0이 이 주소에서 가치를 보유하고 있다고 가정할 수 있다.

 

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

아래 Script 파일을 만들었다.

checkmeminuse.js

 

 

모듈베이스는 정적이며 frida가 자동으로 오프셋을 계산한다. 그리고 해당 메모리 주소로 통신할 때 후킹하면 콘솔에 입력을 넣는다.

 

frida 명령을 아래와 같이 실행했다.

frida -U -l checkmeminuse.js DVIA-v2

이제 아이폰에 설치되어 있는 DVIA-v2 응용 프로그램 내의 Jailbreak Test 1버튼을 클릭하면, 팝업이 뜨면서 콘솔 창에 “Address Entered”로 표시가 된다.

이제 Jailbreak Test1을 누르면 메모리 주소가 사용 중이라는 것을 알 수 있다. (아이폰 화면에 Jailbreak Test1 버튼을 눌러도 동작하지 않음)

 

이제 x8 레지스터에 로드되는 값이 무엇인지 알기 위해 분석했다.

그리고 아래 Script 파일을 프래그래밍 한 후,

returnmemvalue.js

 

 

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

frida -U -l returnmemvalue.js DVIA-v2

이제 응용 프로그램 내에서 재 실행할 수 있고,  Script의 출력 화면을 볼 수 있었다.

 

따라서 주소를 적중 시켰고, x0 레지스터의 값이 1이라는 것을 알게 되었다.

이제 이 함수에 대해 알 수는 없으나, 0으로 변경을 시도하고 일부 BOOLEAN (사실 또는 거짓) 결과를 추측 할 수 있다. 이렇게 해서 첫번째 함수가 일부 검사를 수행했으며, Return 결과는 Jailbreak에 대해 1 또는 Jailbreak되지 않은 경우 0으로 나타났다. 그러면 비교를 위해 x8에 로드되어 어떤 팝업이 표시될 지 분석한다.

Script 파일을 만든 후, 다음 코드를 넣을 수 있었다.

DVIA2bypassjailbreak1.js

 

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

 

(참고 : 우회하려면 x8 레지스터가 아닌 x0 레지스터의 값을 변경해야 함.)

 

이제 아래 명령으로 Script 파일을 실행한 다음, 테스트를 실행하면 이제 탈옥이 아닌 것을 확인할 수 있다.

frida -U -l DVIA2bypassjailbreak1.js DVIA-v2

Script가 정상 실행 되었고, 콘솔 창에 Bypass Test1이라고 출력된 것을 확인하였다.

 

그리고 아이폰 Jailbreak Test1 탭 버튼을 클릭하니 아래와 같이 탈옥 감지 우회(Device is Not Jailbroken)가 되었다.

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/

CrackMe.apk
1.25MB

 

NOX에서 CrackMe.apk 파일을 설치하고 앱을 실행 했는데, 계속 앱 중지가 되었다.

그래서 Android Studio에서 앱을 실행 했더니 정상적으로 실행이 되었다. 앱을 실행 시키면 로그인 화면이 뜨는데, 문자와 숫자를 입력해도 incorrect란 팝업 창만 뜨면서 로그인을 할 수 없어서 다른 방법을 강구했다.

디컴파일(JEB) 툴로 apk파일을 열어 onCreate메소드가 있는 곳을 분석했는데, flag로 보이는 flagging{It_cannot_be_easier_than_this}란 문자가 나와서 flag인 줄 알았는데 확인해 보니 flag가 아니었다.

 

디컴파일 툴로 소스코드 내 flag 확인

 

 

소스코드 내에서 Toast 메소드가 있었는데 어떤 메소드인지 알아내기 위해 계속 분석을 진행 했다. 

Toast 메소드가 true로 반환되므로 함수가 반환되는 것과 동일하게 String(사용자 입력 값)이 필요 했다.

True 로 반환되는 Toast메소드 발견

 

 

if(arg4.equals(c.a(b.a(b.b(b.c(b.d(b.g(b.h(b.e(b.f(b.i(c.c(c.b(c.d(this.getString(2131492920)

 

그 다음에 디컴파일 툴(jadx)res 경로 밑에 values 경로 밑에 strings.xml 소스코드 내에서 의심되는 문자열을 찾았다.

Strings.xml  소스코드 내 의심스런 문자열 발견

 

 

 [[c%l][c{g}[%{%Mc%spdgj=]T%aat%=O%bRu%sc]c%ti[o%n=Wcs%=No[t=T][hct%=buga[d=As%=W]e=T%ho[u%[%g]h%t[%}%

 

 

 

다음으로 c클래스와 b클래스를 분석 했는데, 전체 및 일부 문자열을 치환하는 것을 확인했다.

C 클래스 String 함수에서 문자 치환

 

 

B 클래스 String 함수에서 문자 치환

 

 

C클래스와 B클래스의 메소드를 문자열 값에 적용 시키기 위해 파이썬 스크립트를 만들어 실행 했다.

그러자 아래와 같이 콘솔 창에 flag가 출력 되었다.

 

파이썬 스크립트 실행 후 Flag 획득

 

 

 

-         -