ν‹°μŠ€ν† λ¦¬ λ·°

κ°œμš”

JailbreakλŠ” “iOS νƒˆμ˜₯”μ΄λΌλŠ” 의미λ₯Ό 가지며 Androidμ—μ„œλŠ” “λ£¨νŒ…”이라고 ν‘œν˜„ν•˜κ³  있음. μ΄λŠ” μƒŒλ“œλ°•μŠ€ μ œν•œμ„ ν’€μ–΄ 타 νšŒμ‚¬μ—μ„œ μ‚¬μš©ν•˜λŠ” μ„œλͺ…λ˜μ§€ μ•Šμ€ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수있게 ν•˜λŠ” κ³Όμ •μœΌλ‘œ 일반 μ‚¬μš©μžμ—μ„œ 루트 μ‚¬μš©μžλ‘œ κΆŒν•œ μƒμŠΉλ˜μ–΄ 일반 μ‚¬μš©μž κΆŒν•œμ—μ„œ 접근이 λΆˆκ°€λŠ₯ν•œ μ˜μ—­μ— μ ‘κ·Όν•  수 있게 λ˜λ―€λ‘œ λŒ€λΆ€λΆ„μ˜ μ„œλΉ„μŠ€ 쀑인 μ•±μ—μ„œλŠ” νƒˆμ˜₯된 λ””λ°”μ΄μŠ€μ—μ„œ 앱을 μ΄μš©ν•  수 없도둝 μ œν•œ 두고 μžˆμŠ΅λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ λ§ν•˜λŠ” μƒŒλ“œλ°•μŠ€λž€ "컀널 λ ˆλ²¨μ—μ„œμ˜ iOS μ ‘κ·Όμ œμ–΄ 기술"둜 μ•± 손상 μ‹œ μ‹œμŠ€ν…œκ³Ό 데이터λ₯Ό λ³΄ν˜Έν•˜κΈ°λ„ ν•˜λ©° 타 앱에 λŒ€ν•œ 데이터 λ“± νŒŒμΌμ— μ ‘κ·Όν•˜λŠ” 것을 λ§‰μ•„μ£Όμ§€λ§Œ νƒˆμ˜₯된 λ””λ°”μ΄μŠ€μ˜ 경우 접근이 κ°€λŠ₯ν•΄ 지기 λ•Œλ¬Έμ— λ³΄μ•ˆμƒ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν˜„μž¬ νƒˆμ˜₯된 단말을 λŒ€μƒμœΌλ‘œ νŠΉμ • 이벀트 ν–‰μœ„λ₯Ό μ‹œλ„ν•˜λ©΄ "Device is Jailbroken"μ΄λΌλŠ” 문ꡬ와 ν•¨κ»˜ νƒˆμ˜₯이 νƒμ§€λœλ‹€λŠ” 문ꡬλ₯Ό 좜λ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

이번 μ‹œκ°„μ—λŠ” Frida도ꡬλ₯Ό μ΄μš©ν•΄ μ–΄λ–€ λ°©μ‹μœΌλ‘œ νƒˆμ˜₯ 탐지λ₯Ό μš°νšŒν•  수 μžˆλŠ”μ§€ μ•Œμ•„λ³΄λŠ” μ‹œκ°„μ„ κ°€μ Έλ³΄κ² μŠ΅λ‹ˆλ‹€.

Fridaλ₯Ό 톡해 νƒˆμ˜₯을 μš°νšŒν•˜λŠ” 방법은 크게 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

Fridaλ₯Ό 톡해 iOS ν”„λ‘œμ„ΈμŠ€μ™€ μ—°κ²° -> Class 및 λ©”μ†Œλ“œ 정보 덀프 -> 정보λ₯Ό μŠ΅λ“ ν›„ μ•±μ˜ λŸ°νƒ€μž„ μ‘°μž‘ -> 우회

 

첫 번째 Fridaλ₯Ό μžμ‹ μ˜ λ””λ°”μ΄μŠ€μ™€ μ—°κ²°ν•˜κΈ° μœ„ν•œ ν™˜κ²½ ꡬ좕은 ν•˜λ‹¨μ˜ ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

guleum-zone.tistory.com/137

 

프리닀(Frida) ν™˜κ²½ ꡬ좕

κ°œμš” Fridaλž€ Oleκ°€ κ°œλ°œν•œ DBI(Dynamic Binary Instrumentation) ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€. 파이썬 κΈ°λ°˜μœΌλ‘œ λ§Œλ“€μ–΄μ§„ νˆ΄μ΄κΈ°μ— νŒŒμ΄μ¬ λΌμ΄λΈŒλŸ¬λ¦¬λ₯Ό μ£Όλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.λ˜ν•œ μ—°κ²°λœ λ‹¨λ§μ— λŒ€ν•œ λΆ„석을 μˆ˜

guleum-zone.tistory.com

μžμ‹ μ˜ CMD λ˜λŠ” linux ν„°λ―Έλ„μ—μ„œ frida-ps -Uaλ₯Ό μž…λ ₯ν•˜μ—¬ μ§„λ‹¨ν•˜κ³ μž ν•˜λŠ” μ•±μ˜ Bundle Name을 ν™•μΈν•©λ‹ˆλ‹€.

* λ¦¬μŠ€νŠΈκ°€ λ‚˜νƒ€λ‚˜μ§€ μ•ŠμœΌλ©΄ usr/sbin λ””λ ‰ν† λ¦¬μ—μ„œ ./Frida-server &(λ°±κ·ΈλΌμš΄λ“œ) λͺ…λ Ήμ–΄ μ‹€ν–‰ ν›„ μž¬μ‹œλ„

 

/* File Name is Jacilbreak_Test2.js */
if(Objc.available){
	for(var classname in Objc.classes)
    	console.log(classname)

DVIA-v2 앱에 μ‘΄μž¬ν•˜λŠ” 클래슀 λͺ…을 ν™•μΈν•˜κΈ° μœ„ν•΄ μƒλ‹¨μ˜ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ—¬ 찾고자 ν•˜λŠ” 클래슀 λͺ…을 μ½˜μ†” 화면에 λ„μš°λ„λ‘ ν•΄μ•Ό λ©λ‹ˆλ‹€.

 

μž‘μ„±ν•œ Jailbreak_Test 2.js 파일의 κ²½λ‘œλŠ” νŽΈν•˜κ²Œ λ“œλž˜κ·Έ μ•€ λ“œλ‘­ν•΄μ£Όκ³  "Jail"κ³Ό κ΄€λ ¨λœ ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜λŠ”μ§€ find λͺ…령을 μ‚¬μš©ν•˜μ‹œκ±°λ‚˜. txt 파일둜 좜λ ₯ν•˜μ—¬ μ°Ύμ•„ μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

-U: usb ν™˜κ²½(λ””λ°”μ΄μŠ€ <-> 둜컬 PC)

-l : μž‘μ„±ν•œ 슀크립트 λ‘œλ“œ

 

/* File Name is Jailbreak_Test2.js */
if(Objc.available){
	var classname = "JailbreakDetection"
    var methods = Objc.classes[classname].$ownMethods
    console.log(methods)
}

"JailbreakDetction"μ΄λΌλŠ” 클래슀λͺ…을 ν™•μΈν–ˆμœΌλ‹ˆ ν΄λž˜μŠ€μ— μ‚¬μš©λ˜λŠ” "λ©”μ†Œλ“œ" λͺ…을 확인 ν•΄μ•Ό λ©λ‹ˆλ‹€. 클래슀 μ •λ³΄λŠ” Objc.classes[classname] 에 λ‹΄κΈ°κ³  $ownMethods 속성을 톡해 λ©”μ†Œλ“œ 정보가 console λ‘œκ·Έμ— 찍히게 λ©λ‹ˆλ‹€.

 

+ isJailbroken 이름을 가진 "λ©”μ†Œλ“œ"λ₯Ό μ°Ύμ•˜μœΌλ‹ˆ 이제 νƒˆμ˜₯을 탐지 ν• κ²½μš° λ°˜ν™˜λ˜λŠ” 값을 μ°Ύμ•„ μ‘°μž‘ ν•΄μ•Ό λ©λ‹ˆλ‹€.

+ : ν΄λž˜μŠ€μ— λŒ€ν•œ λ©”μ†Œλ“œ

- : μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ λ©”μ†Œλ“œ

 

/* File Name is Jailbreak_Test2.js */
if(Objc.available){
    var classname = "JailbreakDetection"
    var methodname = "isJailbroken"
    var hook = Objc.classes[classname][mothodname]
    
    Interceptor.attach(hook.implementation,{
    	onLeave:function(retval){
            console.log("[*]Class Name: "+ classname)
            console.log("[*]Method Name: "+ methodname)
            console.log("[*]Type of Return Value: "+hook.returnType)
            console.log("[*]Return Value: "+retval)
        }
    })
}

사전에 ν™•μΈν•œ "클래슀"와 "λ©”μ†Œλ“œ" 정보λ₯Ό μž…λ ₯ν•΄μ£Όκ³  쀑간에 인터셉터 ν•˜μ—¬ λ°˜ν™˜ 값을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

Interceptor의 hookμ—λŠ” ν΄λž˜μŠ€μ™€ λ©”μ†Œλ“œ 정보가 μ €μž₯λ˜μ–΄ 있고 이λ₯Ό implementation ν•˜μ—¬ λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

λ˜ν•œ λ©”μ†Œλ“œμ— λŒ€ν•œ λ°˜ν™˜ κ°’(retval)을 ν™•μΈν•˜κΈ° μœ„ν•΄μ„  "onLeave"λ₯Ό μ‚¬μš©ν•΄μ•Ό λ©λ‹ˆλ‹€.

 

attach 문ꡬ가 λ‚˜νƒ€λ‚˜λ©΄ 앱을 μ‹€ν–‰ν•˜μ—¬ Jailbrea Test 2λ₯Ό ν΄λ¦­ν•˜μ—¬ 찾고자 ν•˜λŠ” λ°˜ν™˜ 값을 ν™•μΈν•˜λ©΄ λ©λ‹ˆλ‹€. 좜λ ₯된 κ²°κ³Όλ₯Ό μš”μ•½ν•˜μžλ©΄ isJailbrokenμ΄λΌλŠ” λ©”μ†Œλ“œλŠ” boolean(True, False) νƒ€μž…μ„ 가지고 있으며 νƒˆμ˜₯ 탐지 μ‹œ "0x1"값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

/* File Name is Jailbreak_Test2.js */
if(Objc.available){
    var classname = "JailbreakDetection"
    var methodname = "isJailbroken"
    var hook = Objc.classes[classname][mothodname]
    
    Interceptor.attach(hook.implementation,{
    	onLeave:function(retval){
            console.log("[*]Class Name: "+ classname)
            console.log("[*]Method Name: "+ methodname)
            console.log("[*]Type of Return Value: "+hook.returnType)
            console.log("[*]Return Value: "+retval)
            
            var new_retval = ptr("0x0")
            retval.replace(new_retval)
            console.log("[*]New Return Value: "+retval)
        }
    })
}

λ°˜ν™˜ κ°’(retval)이 -> 0x1 즉 "1"의 값을 가지고 μžˆμœΌλ‹ˆ 이λ₯Ό ptrλ₯Ό μ‚¬μš©ν•΄ net_retval λ³€μˆ˜μ— 0x0 값을 생성 ν›„ 기쑴의 retvla κ°’κ³Ό μΉ˜ν™˜ν•΄μ£Όλ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

λ°˜ν™˜ 값을 μˆ˜μ •ν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ ν›„ 앱을 λ‹€μ‹œ μ‹€ν–‰ν•΄ λ³΄μ‹œλ©΄ isJailbroken의 λ°˜ν™˜ 값이 μ„±κ³΅μ μœΌλ‘œ 0x0둜 μΉ˜ν™˜λœ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ°˜ν™˜ κ°’ μΉ˜ν™˜μ„ 톡해 νƒˆμ˜₯ 탐지λ₯Ό μš°νšŒν•˜κ²Œ λ©λ‹ˆλ‹€.

 

Frida 참고용 μ½”λ“œ

github.com/interference-security/frida-scripts/blob/master/iOS/README.md

 

interference-security/frida-scripts

Frida Scripts. Contribute to interference-security/frida-scripts development by creating an account on GitHub.

github.com

κ³΅μœ ν•˜κΈ° 링크
Comment