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

Frida μ½”λ“œλ₯Ό 톡해 λŒ€μƒ μ•±μ˜ 클래슀 -> λ©”μ†Œλ“œ -> λ°˜ν™˜ 값을 ν™•μΈν•˜μ—¬ λŸ°νƒ€μž„ 값을 μ‘°μž‘ν•˜λŠ” 방식도 μ‘΄μž¬ν•˜μ§€λ§Œ μ „λ°˜μ μΈ 둜직 뢄석이 ν•„μš”ν•œ κ²½μš°κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. μ΄λ•Œ Ghidraλ₯Ό ν†΅ν•˜λ©΄ μ’€ 더 νŽΈν•˜κ²Œ μ‘°μž‘ν•˜κ³ μž ν•˜λŠ” 정보λ₯Ό 확인 ν›„ μš°νšŒκ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

Frida μ½”λ“œλ₯Ό 톡해 νƒˆμ˜₯ 탐지λ₯Ό μš°νšŒν•˜λŠ” 방법은 ν•˜λ‹¨μ˜ κ²Œμ‹œκΈ€μ„ μ°Έκ³ ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

guleum-zone.tistory.com/146

 

[iOS]Jailbreak 탐지 우회(Frida)

κ°œμš” JailbreakλŠ” “iOS νƒˆμ˜₯”μ΄λΌλŠ” 의미λ₯Ό 가지며 Androidμ—μ„œλŠ” “λ£¨νŒ…”이라고 ν‘œν˜„ν•˜κ³  있음. μ΄λŠ” μƒŒλ“œλ°•μŠ€ μ œν•œμ„ ν’€μ–΄ 타 νšŒμ‚¬μ—μ„œ μ‚¬μš©ν•˜λŠ” μ„œλͺ…λ˜μ§€ μ•Šμ€ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수있게 ν•˜λŠ” κ³Όμ •

guleum-zone.tistory.com

 

Ghidraλ₯Ό 톡해 νƒˆμ˜₯ 탐지λ₯Ό μš°νšŒν•˜κΈ° μœ„ν•΄μ„  λŒ€μƒ 앱에 λŒ€ν•œ λ°”μ΄λ„ˆλ¦¬ νŒŒμΌμ„ 뢄석해야 λ©λ‹ˆλ‹€. μš°μ„  λ²ˆλ“€ μ»¨ν…Œμ΄λ„ˆ 경둜둜 이동해 DVIA-v2 λ””λ ‰ν† λ¦¬λ‘œ μ ‘κ·Όν•©λ‹ˆλ‹€.

 

λ°”μ΄λ„ˆλ¦¬ νŒŒμΌμ„ μƒλŒ€μ μœΌλ‘œ μš©λŸ‰μ΄ ν¬κΈ°λ•Œλ¬Έμ— μ‰½κ²Œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή νŒŒμΌμ„ μš°ν΄λ¦­ν•˜μ—¬ 둜컬 PC둜 Export ν•©λ‹ˆλ‹€.

 

File -> New Project ν•˜μ—¬ ν”„λ‘œμ νŠΈλ₯Ό 생성후 μΆ”μΆœν•œ λ°”μ΄λ„ˆλ¦¬ νŒŒμΌμ„ λ“œλž˜κ·Έ μ•€ λ“œλ‘­ν•΄μ€λ‹ˆλ‹€.

 

Ghidraμ—μ„œ 동적 뢄석을 μˆ˜ν–‰ν•˜κΈ° 전에 ν•΄λ‹Ή 파일이 Mach 였브젝트 λ°”μ΄λ„ˆλ¦¬ 파일인 것을 ν‘œμ‹œν•΄ μ€λ‹ˆλ‹€. OKλ₯Ό λˆ„λ₯Έ ν›„ 계속 μ§„ν–‰ν•©λ‹ˆλ‹€.

 

DVIA-v2 λ°”μ΄λ„ˆλ¦¬ νŒŒμΌμ— λŒ€ν•œ 이름, μ‚¬μ΄μ¦ˆ, 포맷 ν˜•μ‹ λ“± κ²°κ³Ό κ°’μ˜ λ‚΄μš©μ„ κ°„λž΅ν•˜κ²Œ ν‘œμ‹œν•΄μ€λ‹ˆλ‹€. OKλ₯Ό 눌러 λ§ˆμ € 진행해 μ€λ‹ˆλ‹€.

 

동적 뢄석을 μˆ˜ν–‰ν•˜κΈ° 전에 μ˜΅μ…˜μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. κΈ°λ³Έ κ°’ κ·ΈλŒ€λ‘œ 두고 Analyzeλ₯Ό ν΄λ¦­ν•˜λ©΄ μ’€ 전에 λ“œλž˜κ·Έ μ•€ λ“œλ‘­ ν•΄μ€€ λ°”μ΄λ„ˆλ¦¬ νŒŒμΌμ— λŒ€ν•œ μ „λ°˜μ μΈ 뢄석이 μ‹œμž‘λ©λ‹ˆλ‹€.

 

우츑 ν•˜λ‹¨μ— λ³΄μ‹œλ©΄ λͺ¨λž˜μ‹œκ³„κ°€ λŒμ•„κ°€λ©΄μ„œ νΌμ„Όν…Œμ΄μ§€κ°€ μ‘°κΈˆμ”© μƒμŠΉλ©λ‹ˆλ‹€. 100%κ°€ 될 λ•ŒκΉŒμ§€ μž μ‹œ κΈ°λ‹€λ €μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

 

뢄석에 ν•„μš”ν•œ νŠΉμ • λ¬Έμžμ—΄μ„ κ²€μƒ‰ν•΄μ„œ 둜직 뢄석을 효과적으둜 ν•  수 μžˆλ‹€. Search νƒ­μ—μ„œ For String으둜 μ΄λ™ν•©λ‹ˆλ‹€.

 

뢄석에 ν•„μš”ν•œ λ¬Έμžμ—΄μ€ "device is jailbroken"이며 Filter에 μž…λ ₯ν•˜λ©΄ λ°”μ΄λ„ˆλ¦¬ 파일 λ‚΄λΆ€λ₯Ό κ²€μƒ‰ν•˜μ—¬ λ‚˜νƒ€λ‚΄ μ€λ‹ˆλ‹€.

 

String View에 μ›ν•˜λŠ” λ¬Έμžμ—΄μ„ λ”λΈ”ν΄λ¦­ν•˜λ©΄ 메인 화면에 μž…λ ₯ν•œ λ¬Έμžμ—΄μ΄ μ–΄λŠ 라인에 μ‘΄μž¬ν•˜λŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. λΉ¨κ°„ ν…Œλ‘λ¦¬λ₯Ό λ”λΈ”ν΄λ¦­ν•΄μ„œ 둜직으둜 μ΄λ™ν•˜κ³ μž ν•©λ‹ˆλ‹€.

 

νƒˆμ˜₯ 탐지할 μ‹œ λ°œμƒλ˜λŠ” 문ꡬλ₯Ό ν™•μΈν–ˆμœΌλ‹ˆ ν•΄λ‹Ή 문ꡬλ₯Ό 톡해 λ””μ»΄νŒŒμΌλœ λ‚΄μš©κ³Ό λŒ€μ‘°ν•΄λ³΄λ©΄μ„œ 값을 μˆ˜μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ 둜직 νŒŒμ•…μ΄ 쉽지 μ•Šλ‹€λ©΄ Graph ν˜•μ‹μ˜ λ‘œμ§μ„ 톡해 νŒŒμ•…ν•˜λ©΄ 보닀 μ‰½κ²Œ 뢄석이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

Graph Function을 λˆ„λ₯΄λ©΄ DVIA 둜직의 흐름을 νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. w8κ³Ό 0x0 κ°„μ˜ μƒν˜Έκ΄€κ³„λ₯Ό 톡해LAB_100195 da8일 경우 Device_is_Not_Jailbroken으둜 μ΄λ™λ˜κ³  μ•„λ‹ˆλ©΄ Device_is_Jailbroken이 μžˆλŠ” 둜직으둜 μ΄λ™λ˜κ³  μžˆμŒμ„ ν™•μΈν• μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

 

λ©”λͺ¨λ¦¬ μ˜μ—­μ— ν• λ‹Ήλœ μ£Όμ†Œλ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ bdd0 값에 마우슀λ₯Ό 올렀 Imagebase Offset 값을 확인후 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ μž‘μ„±ν•˜μ—¬ 앱을 μ‹€ν–‰μ‹œ 지정해둔 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ‘œ κ±°μΉ˜λ„λ‘ ν•΄μ•Ό λ©λ‹ˆλ‹€.

 

/* File Name is Jailbreak_Test3.js */
var realBase=Module.findBaseAddress('DVIA-v2')
console.log(realBase)

var Jailbreak_address = realBase.add('0x1959dc')
console.log(Jailbreak_address)

Interceptor.attach(Jailbreak_address,{
	onEnter:function(args){
    	console.log(JSON.stringify(this.context))
        }
})

νƒˆμ˜₯ 탐지 λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ 지정해둔 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ‘œ μ΄λ™ν•΄μ„œ μ§€λ‚˜κ°€κ²Œλ˜λ©° (this.context)λ₯Ό 톡해 λ°˜ν™˜λ˜λŠ” λ ˆμ§€μŠ€ν„° 값을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

* λ©”λͺ¨λ¦¬μ—μ„œλŠ” "h"λ₯Ό μ‚¬μš©ν•΄μ„œ 16μ§„μˆ˜λ₯Ό ν‘œν˜„ν•˜λ©° μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” "0x"λ₯Ό μ‚¬μš©ν•΄ 16μ§„μˆ˜μΈ 것을 ν‘œν˜„ν•©λ‹ˆλ‹€.

 

μ½”λ“œλ₯Ό μ‹€ν–‰ 및 앱을 μž‘λ™ν•΄λ³΄λ©΄ νƒˆμ˜₯이 탐지될 μ‹œ w8(x8)의 값이 "1"이 좜λ ₯된 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

-U : usb 둜 μ—°κ²°

-l : 슀크립트 λ‘œλ“œ

0x100ef0000: DVIA λ°”μ΄λ„ˆλ¦¬κ°€ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλœ μ£Όμ†Œ

0x1010859dc: μˆ˜μ •ν•˜κ³ μž ν•˜λŠ” ν•΄λ‹Ή λΆ€λΆ„λ§ŒνΌ μ΄λ™ν•œ λ©”λͺ¨λ¦¬ μ£Όμ†Œ

/* File Name is Jailbreak_Test3.js */
var realBase=Module.findBaseAddress('DVIA-v2')
console.log(realBase)

var Jailbreak_address = realBase.add('0x1959dc')
console.log(Jailbreak_address)

Interceptor.attach(Jailbreak_address,{
    onEnter:function(args){
    	console.log(JSON.stringify(this.context))
        this.context.x8 = 0x0
        console.log(JSON.stringify(this.context))
     }
})

νƒˆμ˜₯된 단말일 경우 x8(w8)의 λ°˜ν™˜ 값이 “1”이 μ˜€μœΌλ‹ˆ μ½”λ“œμ— x8 = 0x0 즉 “0”으둜 μˆ˜μ •ν•˜μ—¬ μ‚½μž…ν•©λ‹ˆλ‹€.

x0 ~ x30(64λΉ„νŠΈ) = w0 ~ w30(32λΉ„νŠΈ) 은 32λΉ„νŠΈμ™€ 64λΉ„νŠΈ ν™˜κ²½μ—μ„œ ν‘œν˜„ν•˜λŠ” 차이일뿐 λ™μΌν•˜λ‹€κ³  λ³΄μ‹œλ©΄ λ©λ‹ˆλ‹€.

 

μˆ˜μ •ν•œ μ½”λ“œλ₯Ό λ‹€μ‹œ μž¬μ‹€ν–‰ν•΄λ³΄λ©΄ x8(w8)의 값이 0으둜 μˆ˜μ •λœ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 이둜써 true 둜직인 경우의 LAB_100195 da8둜 μ΄λ™ν•˜κ²Œ λ˜μ–΄ "Device_is_Not_Jailbreak"이 좜λ ₯되게 λ©λ‹ˆλ‹€.

 

μ„±κ³΅μ μœΌλ‘œ νƒˆμ˜₯을 μš°νšŒν•œ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

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