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

AlertDialog

Dialog(λ‹€μ΄μ–Όλ‘œκ·Έ)λŠ” 말 κ·ΈλŒ€λ‘œ λŒ€ν™” μƒμžμ˜ κ°œλ…μœΌλ‘œ Alert(νŒμ—…)λ₯Ό λ„μ›Œ 앱을 μ‚¬μš©ν•˜λŠ” μ‚¬μš©μžλ“€μ—κ²Œ μΆ”κ°€ μž…λ ₯을 λ°›κ±°λ‚˜ λ‹€μŒ ν–‰μœ„(Yes, No, Cancel)λ₯Ό κ²°μ •μ‹œν‚€λŠ” μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€. 이 λ©”μ‹œμ§€ 창에 μ‚¬μš©μžκ°€ 응닡을 ν•˜μ§€ μ•ŠμœΌλ©΄ 화면에 사라지지 μ•Šκ³  계속 λŒ€κΈ°ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

AlertDialogμ—λŠ” μ‚¬μš©λ˜λŠ” μš”μ†Œλ“€

  • Title: λŒ€ν™”μƒμžμ˜ 제λͺ©
  • Message: λŒ€ν™”μƒμžλ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•œ λ‚΄μš©
  • Positive Button: μ‚¬μš©μžμ˜ 긍정적인 λ°˜μ‘μ„ 의미(Yes, λ„€, 확인)
  • Negative Button: μ‚¬μš©μžμ˜ 뢀정적인 λ°˜μ‘μ„ 의미(No, Cancel, μ·¨μ†Œ)
  • Netural Button: 긍정 λ˜λŠ” 뢀정도 μ•„λ‹Œ λ°˜μ‘μ„ 의미(Cancel, Remind Later

일반적으둜 μ‚¬μš©μžλ“€μ—κ²Œ κ΄‘κ³ μ„± λ™μ˜λ₯Ό μ–»κΈ° μœ„ν•΄μ„œλŠ” μœ„μ™€ 같은 λŒ€ν™” μƒμžλ₯Ό λ„μ›Œ Yes λ˜λŠ” No 같은 응닡을 얻은 ν›„ Mainactivity둜 λ„˜μ–΄κ°€λ„λ‘ κ΅¬ν˜„ν•˜κ²Œ λ©λ‹ˆλ‹€. λ§Œμ•½ Cancel λ²„νŠΌμ΄ κ΅¬ν˜„λ˜μ–΄ μžˆμ§€ μ•Šμ„ 경우 νšŒν”Όλ„ ν•  수 μ—†κΈ° λ•Œλ¬Έμ— κ°œλ°œμžκ°€ κ΅¬ν˜„ν•΄λ‘” νλ¦„λŒ€λ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.

 

Setcancelable ν™œμš©

AlertDialog.Builder => setCancelable(boolean cancelable)

λ³„λ„μ˜ Cancel λ²„νŠΌμ΄ μ—†λŠ” λŒ€ν™”μƒμžλ₯Ό 무λ ₯ν™”ν•˜κΈ° μœ„ν•΄μ„  "Setcacelable" λ©”μ†Œλ“œλ₯Ό 톡해 μ‚¬μš©μž 화면에 λ„μ›Œμ§„ AlertDialog λŒ€ν™” μƒμžλ₯Ό λ’€λ‘œ κ°€κΈ°(Back) ν•˜μ—¬ μ›ν•˜λŠ” νλ¦„λŒ€λ‘œ μ‘°μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

setCancelable은 Boolean 방식이기 λ•Œλ¬Έμ— True λ˜λŠ” False λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

  • True: ν™œμ„±ν™”
  • False: λΉ„ν™œμ„±ν™”(λŒ€λΆ€λΆ„μ˜ λŒ€ν™”μƒμžλŠ” False ν˜•μ‹μ„ 가짐)

μ•±μ˜ 취약점을 ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄μ„  μ΅œμƒμœ„ κΆŒν•œμΈ "root"λ₯Ό 가진 μƒνƒœμ—μ„œ 진행을 ν•˜κ²Œ λ˜λŠ”λ°, λ£¨νŒ… λ””λ°”μ΄μŠ€λ₯Ό 탐지할 경우 AlertDialogλ₯Ό ν˜ΈμΆœμ„ 톡해 exit() μ’…λ£Œμ‹œμΌœ μ œλŒ€λ‘œ 된 접근이 νž˜λ“€μ–΄μ§€κ²Œ λ©λ‹ˆλ‹€.

 

λ§Œμ•½ AlertDialog 창이 ν˜ΈμΆœλ˜λŠ” μ‹œμ μ— Mainactivityκ°€ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ 싀행이 되고 μžˆλŠ” 상황이라면 setCancelable을 μ‘°μž‘ν•˜μ—¬ 앱이 μ’…λ£Œλ˜μ§€ μ•Šλ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 κ³΅κ²©μžλŠ” λ””λ°”μ΄μŠ€μ˜ κΆŒν•œ 검사와 무결성 κ²€μ‚¬κΉŒμ§€ μš°νšŒν•  수 μžˆλŠ” 상황을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

Rooting/Integrity check Bypass

λ£¨νŒ…λœ λ””λ°”μ΄μŠ€μ—μ„œ 앱을 μ‹€ν–‰ν•˜κ²Œ 될 경우 "λ£¨νŒ… 된 λ‹¨λ§κΈ°μ—μ„œλŠ” μ‚¬μš©ν•˜μ‹€ 수 μ—†μŠ΅λ‹ˆλ‹€." λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜κ²Œ λ©λ‹ˆλ‹€. μ—¬κΈ°μ„œ "확인" λ²„νŠΌμ„ λˆ„λ₯΄κ²Œ 될 경우 앱은 κ°•μ œμ μœΌλ‘œ μ’…λ£Œλ˜κ²Œ λ©λ‹ˆλ‹€.

 

λ””μ»΄νŒŒμΌλœ μ½”λ“œλ₯Ό 뢄석해보면 λ£¨νŒ…μ„ νƒμ§€ν•˜κΈ° μœ„ν•΄ 2가지 포인트λ₯Ό μ²΄ν¬ν•©λ‹ˆλ‹€. Smali μ†ŒμŠ€λ₯Ό μˆ˜μ •ν•΄μ„œ λ£¨νŒ…μ²΄ν¬λ₯Ό μš°νšŒν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

  • μ‹€ν–‰λœ λ””λ°”μ΄μŠ€μ—μ„œ "su" λͺ…λ Ήμ–΄κ°€ μ‹€ν–‰λ˜λŠ”μ§€
  • μ‹€ν–‰λœ λ””λ°”μ΄μŠ€μ— λ£¨νŒ…κ³Ό κ΄€λ ¨λœ νŒŒμΌλ“€μ΄ μ‘΄μž¬ν•˜λŠ”μ§€(6경둜)

 

λ¦¬νŒ¨ν‚€μ§• ν›„ 싀행해보면 μ΄λ²ˆμ—λŠ” "μ•± μ„œλΉ„μŠ€κ°€ μΌμ‹œμ μœΌλ‘œ μ€‘μ§€λ˜μ—ˆμŠ΅λ‹ˆλ‹€." λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ "확인" λ²„νŠΌμ„ λˆ„λ₯΄κ²Œ 되면 앱이 κ°•μ œμ μœΌλ‘œ μ’…λ£Œλ˜μ–΄ μ‹€ν–‰ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

μ•±μ˜ 무결성을 μ²΄ν¬ν•˜λŠ” 방법은 해쉬, μΈμŠ€ν†¨λŸ¬, κ°œλ°œμžν‚€(샀이닝킀) λ“± μ—¬λŸ¬ 가지 방법이 μ‘΄μž¬ν•˜μ§€λ§Œ μœ„μ²˜λŸΌ Mainactivitiyκ°€ λŒ€ν™” μƒμžμ™€ 상관없이 λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰λ˜λ©΄ κ°„λ‹¨ν•œ νŠΈλ¦­μ„ 톡해 μ‰½κ²Œ μš°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

MainActivity μͺ½ μ†ŒμŠ€λ₯Ό 확인해보면 총 2곳의 "setPositiveButton"이 μ‘΄μž¬ν•©λ‹ˆλ‹€. 일반적으둜 μš°μΈ‘μ— 배치된 PositiveButton은 μ‚¬μš©μžμ˜ 긍정적인 닡변을 μœ λ„ν•˜λŠ” λ©”μ†Œλ“œ μž…λ‹ˆλ‹€. κ΄‘κ³ μ„± λ™μ˜ 여뢀도 μŠΉμΈμ— ν•„μš”ν•˜λŠ” λ²„νŠΌμ€ μš°μΈ‘μ— 배치되고 쒌츑이 뢀정적인 응닡을 κ°€μ§‘λ‹ˆλ‹€.

 

setPositiveButton => setNeutralButton(쒌츑 배치)

μ‚¬μš©μžμ˜ 앱을 μ’…λ£Œμ‹œν‚€λŠ” Positivebutton이 μ–΄λ–€ 뢀뢄인지 μ²΄ν¬ν•˜κΈ° μœ„ν•΄ ν•˜λ‚˜μ”© μ½”λ“œλ₯Ό λ³€μ‘°ν•΄μ„œ λ¦¬νŒ¨ν‚€μ§• ν•©λ‹ˆλ‹€.

 

NeutralButton λ©”μ†Œλ“œλ₯Ό 톡해 μš°μΈ‘μ— 있던 λ²„νŠΌμ΄ 쒌츑으둜 λ„˜μ–΄κ°„κ²ƒμ„ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ–΄λŠ 라인의 λ²„νŠΌμ΄ μ‚¬μš©μžμ˜ 앱을 μ’…λ£Œμ‹œν‚€λŠ”μ§€ ν™•μΈν–ˆμœΌλ‹ˆ λ‘λ²ˆ 째둜 False둜 λΆ€μ—¬λœ setCancelable λ©”μ†Œλ“œλ₯Ό μ°Ύμ•„μ•Ό ν•©λ‹ˆλ‹€.

 

μ‚¬μš©μžμ˜ 앱을 μ’…λ£Œμ‹œν‚€λŠ” setPositiveButtonμ—λŠ” λŒ€ν™” μƒμžλ₯Ό 무λ ₯ν™”μ‹œν‚€μ§€ λͺ»ν•˜λ„둝 setCancelable(false); λ©”μ†Œλ“œλ₯Ό μΆ”κ°€ν•΄ λ’€μŠ΅λ‹ˆλ‹€.

 

if-eqz v0, :cond_2 => if-nez v0, :cond_2

λ””μ»΄νŒŒμΌ μƒνƒœμ˜ μ½”λ“œμ˜ μœ„μΉ˜λ₯Ό 기얡해두신 ν›„ smali μ½”λ“œλ‘œ λ„˜μ–΄κ°€ λΆ„κΈ°λ¬Έ μˆ˜μ •ν›„ λ¦¬νŒ¨ν‚€μ§• μž‘μ—…μ„ ν•΄μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€.

eqz: ==(κ°™λ‹€)

nez: !=(λ‹€λ₯΄λ‹€)

 

μ΅œμ’…μ μœΌλ‘œ

1. Rooting 체크 smali μ½”λ“œ μˆ˜μ •(su, filepath)

2. 앱을 μ’…λ£Œμ‹œν‚€λŠ” Button 탐색

3. λΆ€μ—¬λœ setCancelable λ©”μ†Œλ“œ λΆ„κΈ°λ¬Έ μˆ˜μ •

μœ„μ˜ 3가지 방법을 톡해 μ‚¬μš©μžμ˜ μ•± κ°•μ œ μ’…λ£Œλ₯Ό 막을 수 있게 λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„  λŒ€ν™” μƒμžκ°€ ν˜ΈμΆœλ˜μ—ˆμ„ λ•Œ MainAcitivity κ°€ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ λ§ˆμŒλŒ€λ‘œ μ‹€ν–‰λ˜μ§€ μ•Šκ²Œ ν•΄μ•Ό λ©λ‹ˆλ‹€. 호좜된 λŒ€ν™” μƒμžμ˜ 응닡을 거친 후에 앱이 μ‹€ν–‰λ˜λŠ” ꡬ쑰라면 보닀 μ•ˆμ „ν•˜κ²Œ μš΄μ˜ν•  수 있게 λ©λ‹ˆλ‹€.

'MOBILE' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[iOS] FairPlay DRM λ³΅ν˜Έν™”  (0) 2021.09.26
[iOS] Shared Clipboard 취약점  (0) 2021.09.25
[iOS] Functions Hooking  (1) 2021.09.24
[iOS] Objection μ£Όμš” λͺ…λ Ήμ–΄  (0) 2021.02.14
[Android] Data Storage(Plain/Encryption) 취약점  (0) 2021.02.13
κ³΅μœ ν•˜κΈ° 링크
Comment