오늘부터 취약한 DIVA 앱 풀이를 모~~~두 해보려고 한다. 10년 전 앱이긴 하지만, DIVA 자체가 워낙 유명하고 전부 풀이하는데, 시간도 많이 소요되지 않을 거라 생각해서 이 앱을 선택했다.

 

이번 파트에선, 분석 환경 구성, 앱 설치만 할 생각이다.

 

# 분석 환경 구성

APK 스튜디오 설치부터 하자. 버전은 5.2.4를 이용할 건데, 그 이유는 다른 최신버전에선 왠지 모르게 에러가 발생해 사용이 안됐기 때문이다.

https://github.com/vaibhavpandeyvpz/apkstudio/releases

 

Releases · vaibhavpandeyvpz/apkstudio

Open-source, cross platform Qt6 based IDE for reverse-engineering Android application packages. It features a friendly IDE-like layout including code editor with syntax highlighting support for *.s...

github.com

 

APK 스튜디오 exe(바이너리) 파일을 실행하면 아래와 같은 창이 뜬다. 이들은 모두 수동으로 파일을 다운로드해야 하며, 경로도 직접 지정해줘야 한다. 그 이유는 APK 스튜디오가 독립적인 프로젝트들을 한 곳에 모은 것이기도 하고 각자 독립성을 유지하고 있기 때문이다.

다운로드 한 뒤 각자 알아서 파일을 모아두고 브라우징 설정하자!

 

다음은 안드로이드 스튜디오 설치를 하자. 모두 디폴트로 설정된 값으로 설치하면 된다. (분석, 개발용 S/W 설치 처음 해본 사람은 내가 뭘 잘 못 건드는게 아닌가..? 할 수도 있는데 내용을 차근차근 읽어보고 하다보면 딱히 어려울 것도 없다, 하다보면 익숙해진다. )

https://developer.android.com/studio

 

Android 스튜디오 및 앱 도구 다운로드 - Android 개발자  |  Android Studio  |  Android Developers

Android Studio provides app builders with an integrated development environment (IDE) optimized for Android apps. Download Android Studio today.

developer.android.com

 

 

# 정적 분석 준비

이제 분석 환경 구성은 끝났다.

 

다음은 DIVA 앱 설치이다. https://github.com/0xArab/diva-apk-file

 

GitHub - 0xArab/diva-apk-file: DIVA (Damn insecure and vulnerable App) is an App intentionally designed to be insecure

DIVA (Damn insecure and vulnerable App) is an App intentionally designed to be insecure - 0xArab/diva-apk-file

github.com

 

원하는 경로에 APK 파일을 다운로드하자.

 

APK 스튜디오 앱을 켜서 좌측 상단 File을 누른 후 Open 버튼을 누르자. 그리고 디컴파일할 APK 파일을 선택한 후 smali, resources, java을 선택해 디컴파일 하자. 

 

디컴파일 되었다! 

 

디컴파일 한 폴더로 들어가면 이런 저런 파일들이 있는 걸 볼 수 있다.

 

파일을 살펴보기 전 우리가 뭘 디컴파일 했는지 알아보자.

smali: 안드로이드 용 어셈블리 코드라고 생각하면 된다. JAVA로 된 파일은 smali 코드로 컴파일 된다.

resources(res): 이미지, 폰트 등 앱을 구성하는 기타 파일들이다.

JAVA: smali 코드는 어셈블리 코드와 비슷하다고 했다. 이는 읽기 힘들어서 smali 코드를 다시 java로 역변환한 것들을 말한다. 

 

이해가 안 될 수 있으니 처음부터 다시 설명하면

APK 파일은 압축파일, EXE 파일이라고 생각하면 된다.

 

APK 파일은 Resource, smali 코드로 주로 구성되는데 압축해제 하면 이 자료들이 나온다.

 

smali 코드는 java를 컴파일한 코드이다. 이 과정을 왜 거치냐면 최적화 때문이다. 컴퓨터는 기계어를 읽고 동작한다. 그런데 JAVA 같은 프로그래밍 언어는 컴퓨터가 읽을 수 없다. 그렇다고 해도 smali 코드를 읽을 수도 없다. 하지만 프로그래밍 언어보단 smali 코드가 더 읽고 해석하기 쉽다. 그래서 java를 smali 코드로 컴파일(변환)한다. 

 

우리는 smali 코드를 그대로 읽기 힘들다. 기계어에 조금 더 가까운 언어이기 때문이다. 그래서 이를 우리에게 익숙한 JAVA로 디컴파일(역변환)할 수 있다.

# 디컴파일한 JAVA 코드 일부
package android.support.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.LOCAL_VARIABLE})
@Documented
@Retention(RetentionPolicy.CLASS)
/* loaded from: classes.dex */
public @interface AnimatorRes {
}

 

# 디컴파일한 JAVA 코드에 대응하는 smali 코드
.class public interface abstract annotation Landroid/support/annotation/AnimatorRes;
.super Ljava/lang/Object;
.source "AnimatorRes.java"

# interfaces
.implements Ljava/lang/annotation/Annotation;


# annotations
.annotation runtime Ljava/lang/annotation/Documented;
.end annotation

.annotation runtime Ljava/lang/annotation/Retention;
    value = .enum Ljava/lang/annotation/RetentionPolicy;->CLASS:Ljava/lang/annotation/RetentionPolicy;
.end annotation

.annotation runtime Ljava/lang/annotation/Target;
    value = {
        .enum Ljava/lang/annotation/ElementType;->METHOD:Ljava/lang/annotation/ElementType;,
        .enum Ljava/lang/annotation/ElementType;->PARAMETER:Ljava/lang/annotation/ElementType;,
        .enum Ljava/lang/annotation/ElementType;->FIELD:Ljava/lang/annotation/ElementType;,
        .enum Ljava/lang/annotation/ElementType;->LOCAL_VARIABLE:Ljava/lang/annotation/ElementType;
    }
.end annotation

 

 

# 취약 앱(DIVA) 설치

설치하기 전 우리가 지금까지 한 것이 뭔지 확인해보자.

우리가 한 건 '정적 분석' 준비이다.

분석은 '정적 분석' 과 '동적 분석' 으로 나뉜다. 코드 단에서 어떤 문제가 발생하는지 보고 예측하는 걸 정적 분석이라고 하고 실제 동작에 어떤 문제가 생기는지 보는걸 동적 분석이라고 한다.

 

지금까지 한 건 APK 파일 안에 담긴 파일들을 끌어내서 '정적 분석' 준비를 끝낸 것이다.

 

이제 '동적 분석'을 하기 위해 앱을 설치해보자.

 

앱 설치도 2개의 방법이 있다.

1. 안드로이드 스튜디오에 내장된 가상환경에 설치

2. 실제 스마트폰에 설치(루팅 필요)

 

나는 실제 스마트폰으로 연습할 필요가 있어서 실제 스마트폰을 이용할 것이지만, 안드로이드 스튜디오 가상환경을 이용해도 문제는 없다.

 

## 안드로이드 스튜디오 가상환경에 APK 파일 설치부터 해보자.

안드로이드 스튜디오 우측 device manage 를 클릭해 + 버튼을 누른 후 create virtual machine을 클릭하자. 그 뒤 small phone 머신을 설치하자. 설치엔 시간이 꽤 소요된다. (API는 현재 기준 24 버전을 이용해야 한다.)

 

설치 후 실행을 누르면 정상적으로 부팅된 걸 볼 수 있다.(Pixel은 신경쓰지 마라)

 

안드로이드 스튜디오 좌측 하단에 보면 터미널 아이콘이 있다. 이를 클릭한 뒤 adb devices 명령어로 가상환경 디바이스와 연결한 뒤 adb install 로 apk 파일 설치하면 된다.

 

Diva가 생겼어요..!

 

 

## 실제 스마트폰에 DIVA 설치

스마트폰을 연결하면 Type에 Physical로 뜬다. adb devices로 연결한 후 apk 파일을 설치하자.

 

나의 경우 커널SU가 설치되어 있어서 이를 이용해 앱 루팅이 가능하다. 이거 하려면 펌웨어 다시 설치하고.. 커널SU 설치해야 하는데... 설명하기 너무 귀찮아... (솔직히 나도 따라해서 다시 봐야 한다. 루팅 꼭 필요해서 실제 폰으로 할거면 커널SU 하세염)

https://hackcatml.tistory.com/190 여기 갤럭시S9 대상 커널 SU 방법에 대해 올린 사람이 있다. 이분꺼 따라해도 되고... https://kernelsu.org/guide/installation.html 공식 가이드 보고 따라해도 된다. (나중에 시간 나면 영상으로 찍어서 올려보도록 하겠다)

* 잘 기억은 안나는데 최신 스마트폰은 펌웨어 재설치 안해도 딸깍만 하면 커널SU 앱 설치가 가능한 걸로 안다. 잘 찾아봐라

 

 

# 후기

장차 2~3시간 걸려서 분석환경 셋팅 글 작성이 끝났다... 이 글 보는 사람은 빨리 할 수 있겠지...? (부럽다)

 

커널SU 같은 경우는 루팅하는 방법 중 하나인데 요즘 주로 쓰인다. magisk를 이용해 루팅하는 방법도 있기도 하다. magisk를 쓰면 해당 생태계를 쓸 수 있지만, 루팅 탐지도 당하기 쉽다. 그래서 난 커널SU를 쓸려고 한다.(나중에 Magisk도 쓰게 되겠지만.. 그건 그떄의 나에게 맡겨야지)

 

어쨌든

모바일 환경 분석 공부가 당장 필요해서 요 며칠간은 이거하면서 밤새야 한다... 미래의 나 건승을 빈다

+ Recent posts