DVIA 앱의 [MENU] - [Binary Patching]을 풀어보겠습니다.

 

첫 화면이고, 여러 문제를 볼 수 있는데 Login Method 1 / Check For Jailbreak / Show alert / Kill Application이 있지만 Login Method 1만 풀이를 올리도록 하겠습니다. 사실 하나만 풀면 나머지도 다 풀 수 있는거라.. ;)

 

IDA를 통해 login 문자열이 들어간 함수를 확인한 결과 ApplicationPatchingDetailsVC loginMethod1Tapped:를 확인할 수 있었습니다.

 

사실 소스코드를 좀만 살펴보면 소스에 ID/PW가 노출되어 있지만, 목적은 이게 아니니까 넘어가서 비교 후 분기문이나 인증 성공 함수 호출하는 부분을 찾아보겠습니다.

 

해당 함수의 끝 부분에 분기문을 통해 인증 결과값으로 성공 혹은 실패 로직을 실행하고 있습니다.

그럼 분기문(B.EQ loc_100170C58)을 변조하여 인증실패일 경우 SuccessPage를 호출하는 것으로 Binary를 패치하겠습니다.

 

이 페이지에서 opcode의 hex값을 확인 할 수 있는데, BEQ는 000100, BNE는 000101인 것을 확인 할 수 있습니다.

 

다음과 같이 IDA에서 BEQ(000100)을 BNE(000101)로 변경해줍니다. 

 

IDA에서 확인하면 BNE로 변경된 것을 확인 할 수 있습니다.

다만.. IDA에서 Binary Patch가 안되서 Hopper라는 툴을 많이 이용한다고 하시는데요(IDA에서도 되나요?) 저는 그냥 IDA에서 분석하고 헥스에디터로 헥스값을 변경해 줍니다... (Hopper는 유료입니다)

 

IPA파일을 zip파일로 확장자 변경 후, 실제 실행파일을을 헥스에디터 프로그램으로 열어서 원하는 바이너리를 변경하고 Cydia Impactor로 재설치 해주세요

 

재설치 후에 임의의 문자열(aa/aa)를 입력한 결과,

 

인증 우회하여 로그인에 성공한 화면을 확인할 수 있습니다.

 

※ OPCode 출처 : https://opencores.org/projects/plasma/opcodes

'Mobile' 카테고리의 다른 글

ro.debuggable 변경을 통한 동적 디버깅  (2) 2019.09.23
IDA DEX,SO 동적디버깅  (0) 2019.09.23
Cydia Impactor 에러 모음  (1) 2019.09.03
DVIA (Jailbreak Detection 2 ... Frida)  (0) 2019.08.28
DVIA (Jailbreak Detection ... Frida)  (3) 2019.08.27

DVIA라는 iOS 점검 실습용이 있는데, 실습용으로도 좋고 평소 안드로이드만 하다보니 iOS이 너무 약해서 공부할겸 풀어보고 있는데 괜찮은 앱인 것 같아 포스팅하려 합니다.

 

http://damnvulnerableiosapp.com/

 

DVIA (Damn Vulnerable iOS App) - A vulnerable iOS app for pentesting

A vulnerable iOS app for pentesting

damnvulnerableiosapp.com

앱 다운로드 주소는 다음과 같고, 현재 v2까지 나와있는데 v1부터 풀어보도록 하겠습니다.

 

앱 설치 후에 왼쪽 상단 [Menu] - [Jailbreak Detection]으로 들어갑니다.

 

그럼 다음과 같은 화면을 볼 수 있는데, Jailbreak Test 1,2를 각각 클릭하면 탈옥여부를 탐지하여 Alert창을 띄워줍니다.

 

그럼 실행파일을 IDA를 통해 분석해보겠습니다.

함수명 중 "jail"이란 문자가 들어간 함수명을 검색했을 때 왼쪽상단과 같이 출력됩니다. Test1,2가 있는것으로 보아 각각 Test1,2를 클릭했을 때 실행되는 함수로 추측이 가능합니다.

 

소스코드 중 빨간 네모박스 위의 $OBJC_CLASS_$_DamnVulnerableAppUtilities의 isJailbroken함수로 넘어가네요.

 

즉, jailbreakTest1Tapped: 함수에서 isJailbroken함수를 호출하는 것을 알 수 있습니다.

 

isJailbroken함수를 살펴보면 bool return형을 가진 함수고 내부 탈옥탐지 로직을 확인할 수 있습니다.

위 사진에서는 Cydia.app만 보이지만 소스코드를 더 살펴보면 /bin/bash, apt, 등등이 있는지 확인하는 것을 알 수 있습니다.

 

그 후에 해당 파일이 존재하면 true(탈옥), 존재하지 않다면 false(미탈옥)을 리턴해서 탈옥여부를 확인합합니다.

 

Frida를 통해 리턴함수를 조작하여 탈옥탐지를 우회하도록 하겠습니다.

 

if (ObjC.available) {

try {
var className = "JailbreakDetectionVC";    # 후킹할 클래스 명
var funcName = "- isJailbroken";   # 후킹할 클래스 내 함수명(앞의 -도 적어주셔야 합니다.) 
var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');

 

Interceptor.attach(hook.implementation, {
onLeave
: function(retval) { console.log("[*] Class Name: " + className);  #onLeave함수를 통해 함수호출후 리턴값 조작 
console
.log("[*] Method Name: " + funcName);
console
.log("\t[-] Type of return value: " + typeof retval);
console
.log("\t[-] Original Return Value: " + retval);
newretval
= ptr("0x0")  
retval
.replace(newretval)   # true를 false로 변조하여 탈옥탐지 우회 시 
console
.log("\t[-] New Return Value: " + newretval) } });

}

catch(err) { console.log("[!] Exception2: " + err.message); } }

else { console.log("Objective-C Runtime is not available!"); }

위 소스파일을 js파일로 저장한 후, 파일을 저장한 경로에서 frida -U -l [js파일].js DVIA를 통해 실행하면

 

다음과 같이 탈옥탐지 우회가 가능합니다.

 

iOS는 Android와 다른 부분이 꽤 존재하는데 이부분때문에 상당히 시간이 많이 걸렸네요... 차후에 Try&Err과 주의점(?)도 포스팅 하겠습니다.

 

Frida가 Android는 자료가 많아지는데 iOS는 아직 많이 없는 것 같아 차근차근 올려보겠습니다.

 

 

출처 : https://blog.attify.com/bypass-jailbreak-detection-frida-ios-applications/

+ Recent posts