ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [μ•ˆλ“œλ‘œμ΄λ“œ 리버싱] μ•ˆλ“œλ‘œμ΄λ“œ μ‹œμŠ€ν…œ 이해 :: λ³΄μ•ˆ λͺ¨λΈ, μ„œλͺ…, ν‚€μŠ€ν† μ–΄, apk
    SECURITY/Android Reversing 2022. 1. 20. 00:14

     

    μ•ˆλ“œλ‘œμ΄λ“œ λ³΄μ•ˆ λͺ¨λΈκ³Ό, 개발자 μ„œλͺ…, .apk 파일 λ“± μ–΄λ–€ λ³΄μ•ˆμ μΈ μš”μ†Œκ°€ 적용되고 있고,

    μ‹€μ œ λ°°ν¬κΉŒμ§€ μ–΄λ–€ 일이 λ°œμƒν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

     


    μ•ˆλ“œλ‘œμ΄λ“œ λ³΄μ•ˆ λͺ¨λΈ

    μ•ˆλ“œλ‘œμ΄λ“œλŠ” 기본적인 λ¦¬λˆ…μŠ€ 컀널 + μŠ€λ§ˆνŠΈν°μ— λ§žλŠ” λ³΄μ•ˆ κΈ°λŠ₯ κ΅¬μ„±ν•©λ‹ˆλ‹€.

    κ·Έ μ€‘μ—μ„œ 짚고 λ„˜μ–΄κ°€μ•Ό ν•  사항듀을 κ°„λ‹¨νžˆ μ‚΄νŽ΄λ³΄κ³  λ„˜μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€.

    • UID: μ•± μ„€μΉ˜ μ‹œ κ³ μœ ν•œ UID λ₯Ό μžλ™μœΌλ‘œ ν• λ‹Ήν•΄μ£ΌλŠ”λ°, μ΄λŠ” 앱을 λ³΄ν˜Έν•΄μ£ΌλŠ” μƒŒλ“œλ°•μŠ€ 역할을 ν•œλ‹€.
    • Permission: 앱에 ν•„μš”ν•œ κΆŒν•œμ„ μ•±μ—μ„œ μš”μ²­ν•΄μ•Ό ν•œλ‹€. (ex. 카메라, μ „ν™” λ“±) μ΄λŠ” AndroidManifest.xml 에 μž‘μ„±ν•΄λ‘κ³  ν•„μš”ν•  λ•Œ κΆŒν•œμ„ μš”μ²­ν•˜λ©΄ λœλ‹€.
    • TrustZone: μ£Όμš”ν•œ 정보λ₯Ό λΆ„λ¦¬λœ 곡간에 μ €μž₯ν•΄λ‘λŠ” 것. 즉, λ””λ°”μ΄μŠ€ 곡간을 물리적 / 논리적 μ˜μ—­μœΌλ‘œ λΆ„λ¦¬ν•˜μ—¬ μ€‘μš”ν•œ λ‚΄μš©μ΄ λ°”λ‘œ λ…ΈμΆœλ˜μ§€ μ•Šλ„λ‘ ν•œλ‹€. μ΄λ ‡κ²Œ λ³΄ν˜Έλ˜λŠ” μ˜μ—­μ„ TEE (Trusted Execution Environment) 라고 ν•œλ‹€.
    • 개발자 μ„œλͺ…: μΆœμ‹œ, 즉 release μ—λŠ” λ°˜λ“œμ‹œ 개발자 μ„œλͺ…이 ν•„μš”ν•˜λ‹€. (단, debug λͺ¨λ“œμ—μ„œλŠ” μ„œλͺ…이 ν•„μš”ν•˜μ§€ μ•Šλ‹€)
    • μ•”ν˜Έν•™μ  ν•΄μ‹œ 트리λ₯Ό μ΄μš©ν•˜μ—¬ λ””λ°”μ΄μŠ€μ˜ 무결성을 κ²€μ¦ν•œλ‹€. μ•”ν˜Έν•™μ  ν•΄μ‹œλ₯Ό μ‚¬μš©ν•œλ‹€λŠ” 것은, 원본이 μˆ˜μ •λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜λ €λŠ” 것이고 이λ₯Ό 톡해 무결성을 검증할 수 μžˆλ‹€.
    • SELinux: κ°•μ œ μ ‘κ·Ό μ œμ–΄λ₯Ό ν¬ν•¨ν•œ μ ‘κ·Ό μ œμ–΄ λ³΄μ•ˆ 정책을 μ§€μ›ν•˜λŠ” λ¦¬λˆ…μŠ€ 컀널 λ³΄μ•ˆ λͺ¨λ“ˆλ‘œ, μ•ˆλ“œλ‘œμ΄λ“œ 5.0 λΆ€ν„° μ™„μ „νžˆ 적용되고 μžˆλ‹€. (μ ‘κ·Ό μ œμ–΄ DAC, MAC, RBAC 쀑 MAC 에 ν•΄λ‹Ή) κ°•μ œ μ ‘κ·Ό μ œμ–΄λŠ” "κ΄€λ¦¬μž"에 μ˜ν•΄ μ •μ˜λœ κΆŒν•œκΉŒμ§€λ§Œ μ‚¬μš© κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€λŠ” 것이닀.

     

     

    μ•ˆλ“œλ‘œμ΄λ“œ μ•± λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€

    Android λΉŒλ“œ μ‹œμŠ€ν…œμ€ , 

    • μ•± λ¦¬μ†ŒμŠ€ λ° μ†ŒμŠ€ μ½”λ“œλ₯Ό μ»΄νŒŒμΌ
    • ν…ŒμŠ€νŠΈ
    • μ„œλͺ…
    • 배포할 수 μžˆλŠ” Android Application Package (APK) λ˜λŠ” Android App Bundle (AAB) 둜 νŒ¨ν‚€μ§•

     

    을 ν•©λ‹ˆλ‹€.

     

    Android Studio λŠ” Gradle 을 μ‚¬μš©ν•˜μ—¬ λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μžλ™ν™”ν•˜κ³  κ΄€λ¦¬ν•©λ‹ˆλ‹€.

    Gradle μ—μ„œ μž‘μ„±ν•œ λ‚΄μš©μ€ Android Studio μ™€ λ…λ¦½μ μœΌλ‘œ μž‘λ™ν•˜μ—¬ Android Studio κ°€ μ„€μΉ˜λ˜μ§€ μ•Šμ•˜μ–΄λ„ λΉŒλ“œκ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

     

    λ”°λΌμ„œ λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€λŠ” λ‹€μŒκ³Ό 같이 ν”„λ‘œμ νŠΈλ₯Ό APK λ‚˜ AAB 둜 λ³€ν™˜ν•˜λŠ” κ³Όμ •μœΌλ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

     

    https://developer.android.com/studio/build

     

    μœ„ 사진은 일반적인 Android μ•± λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.

    • 1) Compiler λŠ” μ†ŒμŠ€ μ½”λ“œλ₯Ό DEX (Dalvik Executable) 둜 λ³€ν™˜ν•˜κ³ , λ‹€λ₯Έ λͺ¨λ“  것도 컴파일된 λ¦¬μ†ŒμŠ€λ‘œ λ³€ν™˜ν•œλ‹€. DEX νŒŒμΌμ—λŠ” Android κΈ°κΈ°μ—μ„œ μ‹€ν–‰λ˜λŠ” λ°”μ΄νŠΈ μ½”λ“œκ°€ ν¬ν•¨λœλ‹€. (Dalvik 에 λŒ€ν•œ μ •λ³΄λŠ” 이전 ν¬μŠ€νŒ…)
    • 2) μΆœμ‹œλ₯Ό μœ„ν•΄ λΉŒλ“œλ₯Ό μ€€λΉ„ν•˜λŠ” κ°œλ°œμžλŠ” μΆœμ‹œ λ²„μ „μ˜ ν‚€μŠ€ν† μ–΄λ₯Ό μ€€λΉ„ν•©λ‹ˆλ‹€.
    • 3) Packager λŠ” DEX 파일 + 컴파일된 λ¦¬μ†ŒμŠ€λ₯Ό κ²°ν•©ν•˜μ—¬ APK λ˜λŠ” AAB (선택) λ₯Ό λ§Œλ“ λ‹€.
    • 4) Packager κ°€ ν‚€μŠ€ν† μ–΄λ₯Ό μ‚¬μš©ν•΄ 3) μ—μ„œ λ§Œλ“  APK λ‚˜ AAB 에 μ„œλͺ…ν•œλ‹€. (μΆœμ‹œν•˜λ €λ©΄ κΌ­ 해야함)
    • 5) μ΅œμ’… APK λ₯Ό μƒμ„±ν•˜κΈ° 전에, Packager λŠ” 앱을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ zipalign 도ꡬλ₯Ό μ‚¬μš©ν•œλ‹€.

     

    μ΄λ ‡κ²Œ μƒμ„±ν•œ APK νŒŒμΌμ€ λ°”λ‘œ μŠ€λ§ˆνŠΈν°μ— μ„€μΉ˜ν•  수 있고, μΆœμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    (λ¬Όλ‘  λ°°ν¬λŠ” μ •λ‹Ήν•œ μ•±μŠ€ν† μ–΄μ—μ„œ!)

     

     

    μ•± μ„œλͺ…

    앱에 μ„œλͺ…ν•˜λŠ” 것을 톡해 이 앱을 λ³€κ²½ν•œ μ‚¬μš©μžλ₯Ό μ•Œκ³ , μ •λ‹Ήν•œ μ‚¬μš©μžμΈμ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

    즉, 제3μžκ°€ 앱을 λ³€ν˜•μ‹œν‚€κ³  λ‹€μ‹œ μŠ€ν† μ–΄μ— μ—…λ‘œλ“œμ‹œν‚€λŠ” 것은 λΆˆκ°€λŠ₯ν•˜κ²Œ ν•˜λ €λŠ” 것인 λ™μ‹œμ— 앱에 λŒ€ν•œ μ±…μž„μ„ (λΆ€μ • 방지) λ‘λŠ” κ²ƒμœΌλ‘œ μ΄ν•΄ν•˜λ©΄ 될 κ²ƒμž…λ‹ˆλ‹€.

     

    Google μ—μ„œλŠ” Play μ•± μ„œλͺ…μœΌλ‘œ μ•±μ˜ μ„œλͺ… ν‚€λ₯Ό κ΄€λ¦¬ν•˜κ³  λ³΄ν˜Έν•˜λ©°, 배포할 APK 에 μ„œλͺ…ν•˜λŠ” 데에 μ‚¬μš©ν•©λ‹ˆλ‹€.

    Play μ•± μ„œλͺ…은 2021λ…„ 8μ›” μ΄μ „μ—λŠ” μ„ νƒμ‚¬ν•­μ΄μ—ˆμœΌλ‚˜, μ΄μ œλŠ” Google Play μŠ€ν† μ–΄μ— μ—…λ‘œλ“œν•˜λ €λ©΄ ν•„μˆ˜μ‚¬ν•­μž…λ‹ˆλ‹€.

    Play μ•± μ„œλͺ…은 μ„œλͺ… 킀와 μ—…λ‘œλ“œ ν‚€μ˜ 2가지 ν‚€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

    • μ„œλͺ… ν‚€: μ‚¬μš©μžμ˜ 신원 확인, 배포λ₯Ό μœ„ν•΄ APK 에 μ„œλͺ…ν•˜λŠ” 데에 μ‚¬μš©
    • μ—…λ‘œλ“œ ν‚€: κ°œλ°œμžκ°€ λ³΄κ΄€ν•˜λ‹€κ°€ 앱을 Google Play μŠ€ν† μ–΄μ— μ—…λ‘œλ“œν•˜κΈ° μœ„ν•΄ μ„œλͺ…ν•  λ•Œ μ‚¬μš©
      단, μƒˆλ‘œμš΄ μ—…λ‘œλ“œ ν‚€λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠμœΌλ©΄ μ•± μ„œλͺ… ν‚€λ₯Ό μ—…λ‘œλ“œ ν‚€λ‘œ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

     

    https://developer.android.com/studio/publish/app-signing

     

    μ—¬κΈ°μ„œ λ³„λ„μ˜ μ—…λ‘œλ“œ ν‚€λ₯Ό μ‚¬μš©ν•˜λ©΄ 사건 λ°œμƒ μ‹œ μ—…λ‘œλ“œ ν‚€ μž¬μ„€μ •μ„ μš”μ²­ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    (주의: 2021λ…„ 8μ›” 이전에 μƒμ„±ν•œ μ•± 쀑 Play μ•± μ„œλͺ…을 μ„ νƒν•˜μ§€ μ•Šμ€ 경우 μ•± μ„œλͺ… ν‚€λ₯Ό λΆ„μ‹€ν•˜λ©΄ 앱을 μ—…λ°μ΄νŠΈν•  수 μ—†μŠ΅λ‹ˆλ‹€.)

    λ˜ν•œ, μ•± μ„œλͺ… 킀와 μ—…λ‘œλ“œ ν‚€λŠ” λ°˜λ“œμ‹œ κΈ°λ°€λ‘œ μœ μ§€ν•˜λ˜, 각 ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±ν•œ μΈμ¦μ„œλŠ” κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    Play μ•± μ„œλͺ…을 κ΅¬μ„±ν•œ ν›„ 앱을 μΆœμ‹œν•˜λ©΄ Google Playμ—μ„œ μ•±μ˜ μ„œλͺ… ν‚€λ₯Ό 생성(κΈ°μ‘΄ ν‚€λ₯Ό μ—…λ‘œλ“œν•œ 경우 μ œμ™Έ)ν•˜κ³  κ΄€λ¦¬ν•©λ‹ˆλ‹€.

     

    이런 ν‚€μŠ€ν† μ–΄λ₯Ό μƒμ„±ν•˜λŠ” 것은 Android Studio μ—μ„œ κ°„λ‹¨νžˆ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    ν‚€μŠ€ν† μ–΄λ₯Ό λ§Œλ“€ λ•Œ ν•„μš”ν•œ 것은 μ €μž₯ μœ„μΉ˜, λΉ„λ°€λ²ˆν˜Έ, μœ νš¨κΈ°κ°„ 등이 μžˆμŠ΅λ‹ˆλ‹€.

     

     

    ν‚€μŠ€ν† μ–΄ ꡬ쑰

    Android Keystore μ‹œμŠ€ν…œμ€ Android 4.0 μ—μ„œ λ„μž…λœ KeyChain API (https://developer.android.com/reference/android/security/KeyChain) μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€. 즉, KeyChain 으둜 X.509 (μΈμ¦μ„œ ν‘œμ€€) μΈμ¦μ„œ chain 인증을 μ§„ν–‰ν•˜λŠ” κ²ƒμœΌλ‘œ, 루트 μΈμ¦μ„œμ˜ μœ νš¨μ„±μ„ νŒλ‹¨ν•©λ‹ˆλ‹€.

    ν‚€μŠ€ν† μ–΄λŠ” μ•”ν˜Έν™” ν‚€λ₯Ό μ»¨ν…Œμ΄λ„ˆμ— μ €μž₯ν•˜μ—¬ ν‚€λ₯Ό μΆ”μΆœν•˜κΈ° μ–΄λ ΅κ²Œ λ§Œλ“€λ©΄μ„œ ν‚€λ₯Ό μ•”ν˜Έν™”μ— μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

    λ˜ν•œ, λ‹€μŒμ˜ νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

    • μ•± ν”„λ‘œμ„ΈμŠ€κ°€ μ†μƒλœ 경우 κ³΅κ²©μžκ°€ μ•± ν‚€λ₯Ό μ‚¬μš©ν•  수 μžˆμ§€λ§Œ Android κΈ°κΈ° μ™ΈλΆ€μ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ ν‚€ 자료λ₯Ό μΆ”μΆœν•  μˆ˜λŠ” μ—†λ‹€.
    • ν‚€ 자료λ₯Ό Android 기기의 λ³΄μ•ˆ ν•˜λ“œμ›¨μ–΄(TEE(μ‹ λ’°ν•  수 μžˆλŠ” μ‹€ν–‰ ν™˜κ²½), SE(λ³΄μ•ˆ μš”μ†Œ) λ“±)에 바인딩할 수 μžˆλ‹€. 킀에 이 κΈ°λŠ₯을 μ‚¬μš©ν•˜λ„λ‘ μ„€μ •ν•˜λ©΄ ν‚€ μžλ£Œκ°€ λ³΄μ•ˆ ν•˜λ“œμ›¨μ–΄ 외뢀에 λ…ΈμΆœλ˜μ§€ μ•ŠλŠ”λ‹€. 즉, apk 에 ν‚€μŠ€ν† μ–΄λ₯Ό 두지 μ•Šμ•„μ„œ apk κ°€ λ…ΈμΆœλ˜μ–΄λ„ κ³΅κ²©μžκ°€ ν‚€λ₯Ό μΆ”μΆœν•  수 μ—†λ‹€.
    • μ‹œμŠ€ν…œμ€ StrongBox Keymaster (Android 9 μ΄μƒμ—μ„œ, ν•˜λ“œμ›¨μ–΄ λ³΄μ•ˆ λͺ¨λ“ˆμ— μƒμ£Όν•˜λŠ” Keymaster HAL κ΅¬ν˜„) 에 μ €μž₯된 ν‚€λ₯Ό 검사할 λ•Œ TEE(μ‹ λ’°ν•  수 μžˆλŠ” μ‹€ν–‰ ν™˜κ²½) λ₯Ό μ‚¬μš©ν•˜μ—¬ ν‚€μ˜ 무결성을 μž…μ¦ν•©λ‹ˆλ‹€.

     

    KeyStoreλŠ” KeyPairGenerator 및 KeyGenerator 와 λ™μΌν•œ ν‚€ μœ ν˜•μ„ μ§€μ›ν•©λ‹ˆλ‹€.

     

    κ³΅κ°œν‚€, λŒ€μΉ­ν‚€ μ•”ν˜Έ μ•Œκ³ λ¦¬μ¦˜μ„ λͺ¨λ‘ μ§€μ›ν•˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

     

    이런 ν‚€μŠ€ν† μ–΄λŠ” κ·Έ λ³΄μ•ˆμ„±μœΌλ‘œ 인해 μ„œλͺ… ν‚€ 뿐만 μ•„λ‹ˆλΌ, λ‹€λ₯Έ λ―Όκ°ν•œ 정보듀을 μ €μž₯ν•˜λŠ” 데에 μ΄μš©ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€.

     

     

    .apk νŒŒμΌμ΄λž€?

    μ•ˆλ“œλ‘œμ΄λ“œ 앱은 기본적으둜 .apk λΌλŠ” ν™•μž₯자λ₯Ό κ°€μ§€μ§€λ§Œ, 사싀은 zip ν˜•μ‹μœΌλ‘œ μ••μΆ•λœ νŒŒμΌμž…λ‹ˆλ‹€.

    μ†ŒμŠ€ 파일 (.class) 을 Dalvik 이 인식할 수 μžˆλ„λ‘ dex 파일둜 λ³€ν™˜ ν›„ Packager κ°€ μƒμ„±ν•˜λŠ” 파일둜, 인증을 μœ„ν•œ μ„œλͺ…도 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μŠ€λ§ˆνŠΈν°μ—μ„œ μ‹€ν–‰μ‹œν‚€λ©΄ μ‹€μ§ˆμ μΈ μ‹€ν–‰ 파일인 dex 파일이 Dalvik VM μ—μ„œ μž‘λ™ν•˜κ²Œ λ©λ‹ˆλ‹€.

    dex 파일의 κ΅¬μ‘°λŠ” https://source.android.com/devices/tech/dalvik/dex-format.html μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

     

    apk λ‚΄λΆ€ κ΅¬μ‘°λŠ” apk 의 압좕을 ν’€λ©΄ 확인할 수 μžˆλŠ”λ°, λ‹€μŒκ³Ό 같이 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

    • META-INF: μ„œλͺ…κ³Ό κ΄€λ ¨λœ 정보
    • lib: 라이브러리 파일 (.so)
    • res: μ•± 싀행에 ν•„μš”ν•œ resource. 보톡 μ•„μ΄μ½˜ 같은 파일이 ν¬ν•¨λ˜μ–΄ μžˆλ‹€. (컴파일 X)
    • assets: μ•± 싀행에 ν•„μš”ν•œ μžμ›. res 보닀 μš©λŸ‰μ΄ 큰 λ™μ˜μƒ 같은 νŒŒμΌμ„ μ €μž₯ν•œλ‹€. (컴파일 O)
    • AndroidManifest.xml: μ•±μ˜ 정보λ₯Ό μ €μž₯ν•˜λŠ” 파일. νŒ¨ν‚€μ§€λͺ…, 버전, κΆŒν•œ 정보 등이 ν¬ν•¨λ˜μ–΄ μžˆλ‹€. 단, λ””μ»΄νŒŒμΌ 없이 보면은 .xml νŒŒμΌμ€ λ°”μ΄λ„ˆλ¦¬λ‘œ λ˜μ–΄μžˆμ–΄μ„œ λ‚΄μš©μ„ μ•Œμ•„λ³΄κΈ° νž˜λ“€λ‹€.
    • classes.dex: .class νŒŒμΌμ„ bytecode 둜 λ³€ν™˜μ‹œν‚¨ .dex μ†ŒμŠ€ 파일
    • resources.arsc: 리둜슀의 λ°°μ—΄μ΄λΌλŠ” 뜻으둜, res 의 정보가 κΈ°λ‘λ˜μ–΄ μžˆλ‹€.

     

    https://programist.tistory.com/entry/μ•ˆλ“œλ‘œμ΄λ“œ-μ•±-apk-Android-Package의-ꡬ쑰-뢄석

     

    이런 κ΅¬μ‘°λŠ” 직접 apk νŒŒμΌμ„ λœ―μ–΄λ³΄λ©° μ‚΄νŽ΄λ³΄λ©΄ 쒋을 것이고, 이후 μ‹€μ œλ‘œ 해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

     

    λŒ“κΈ€

Designed by Tistory.