ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CodeEngn - MobileApp Analysis L02 문제 풀이
    워게임(Wargame)/코드엔진(CodeEngn) 2020. 2. 26. 19:27

     

    CodeEngn - Mobile App Analysis L02 문제 풀이

     

    코드엔진(CodeEngn) 웹 사이트의 MobileApp Analysis L02 문제를 풀어보고자 한다.

    코드엔진 사이트는 https://codeengn.com 이다.

     

    [그림 1] MobileApp Analysis L02 문제 확인

     

    위 [그림 1]을 살펴보면, MobileApp Analysis L02는 키 값을 찾는 문제이며, 안드로이드 앱(App)은 하단의 노란색 음영되어 있는 플로피디스켓 이미지를 클릭하면 다운받을 수 있다.

    정상적으로 다운로드 받으면 02.7z 파일을 확인할 수 있으며, 압축을 해제하면 안드로이드 앱인 apk 확장자 파일을 확인할 수 있다.

     

    MobileApp Analysis L02 문제의 풀이과정은 다음과 같다.

     

    1. SmartApp L02.apk를 실행시킨다.

    SmartApp L02.apk를 안드로이드 에뮬레이터에 드래그 앤 드롭하여 실행시키면, 다음과 같이 에러가 발생하는 것을 확인할 수 있다.

     

    [그림 2] 안드로이드 에뮬레이터에 정상적으로 설치되지 않는 apk 파일

     

    2. 안드로이드 자바 소스코드 확인을 위해 APK 파일을 압축하고, 폴더명을 변경한다.

    폴더명을 SmartApp L02_java로 변경하고 하위 디렉터리 및 파일을 확인해보니, 개발자 서명 폴더(META-INF)가 존재하지 않음을 확인하였다.

    즉, 위 1. 항목에서 SmartApp L02.apk 내 개발자 서명이 되어있지 않아 정상적으로 설치가 되지 않았음을 알 수 있다.

     

    [그림 3] 압축해제 한 apk 파일 내 존재하지 않는 서명 폴더

     

    3. classes.dex 파일을 디컴파일 하여 자바 소스코드를 추출한다.

    dex2jar를 통해 dex 파일의 디컴파일을 수행하고, 자바 소스코드를 추출한다.

    C:\Android\00.testapp\codeengn02\SmartApp L02\SmartApp L02_java> d2j-dex2jar classes.dex

     

    [그림 4] dex2jar를 통한 dex 파일 디컴파일 수행 모습

     

    [그림 5] dex 파일 디컴파일을 통해 추출된 jar 파일

     

    4. .jar 파일 뷰어 프로그램(jd-gui.exe)을 이용하여, classes-dex2jar.jar 파일을 분석한다.
    com.namdaehyeon.findkey2 패키지의 MainActivity.class 소스코드를 살펴본다.
    먼저 액티비티(Activity)가 최초 생성될때 호출되는 onCreate() 메서드에 대한 확인이 필요하다.

     

    [그림 6] jd-gui를 통해 추출한 jar 파일 소스코드 확인

     

    [ onCreate() 메소드 ]

    6번째 라인을 살펴보면, 아래 ①, ② 항목이 모두 참일 경우에만 7번 째 라인의 소스코드(this.aView.setText(keyString())가 실행되고, 찾고자 하는 키 값을 확인할 수 있다. 

    ① (makeDate() == "2013-11-02-12:35:03")
    makeData() 함수를 호출하여 현재 시간과 '2013-11-02-12:35:03'가 동일한지 확인 후, 같으면 참(1)을, 같이 않으면 거짓(0)을 반환한다.

     

    ② (Volume() == 53))
    Volume() 함수를 호출하여 '53'과 동일한지  확인 후, 같으면 참(1)을, 같이 않으면 거짓(0)을 반환한다.
    그러나  ①과 ② 소스코드는 항상 거짓이므로 찾고자 하는 키 값을 확인할 수 없다. 즉, 이 부분을 참으로 만들 수 있다면 찾는 키 값을 알 수 있다.

     

    1   protected void onCreate(Bundle paramBundle)
    2     {
    3       super.onCreate(paramBundle);
    4       setContentView(2130903040);
    5       this.aView = ((TextView)findViewById(2131230720));
    6       if ((makeDate() == "2013-11-02-12:35:03") && (Volume() == 53)) {
    7         this.aView.setText(keyString());
    8       }
    9     }

     

     

    자바 소스코드를 통해 수정해야 하는 부분을 확인했으니, 이제 스마일리 코드에서 변조를 수행한다.

    변조하기 전에 앞서, 스마일리 코드를 추출하는 과정을 진행한다.

     

    5. apktool을 이용하여 스마일리 코드 추출 후, 폴더명을 변경한다.

    C:\Android\00.testapp\codeengn02> apktool -r d "SmartApp L02.apk"

     

    [그림 7] apktool를 통해 스마일리 코드 추출

     

    [그림 8] 추출된 스마일리 코드 폴더의 폴더명 변경

     

    6. 소스코드 편집기를 통해 MainActivity.smali 파일을 오픈하고, 위 5. 항목에서 확인한 if ((makeDate() == "2013-11-02-12:35:03") && (Volume() == 53))부분을 찾는다.

    아래와 같이 2개의 if-ne 문을 통해 분기시키고 있는 것을 확인할 수 있다.

    v0과 v1이 같지 않으면 cond_0으로 분기되며 아무것도 동작하지도 않고, 반환하지도 않는 것을 확인할 수 있다. 따라서 cond_0 으로 분기되지 않도록 해야 한다.

     

    - 114 라인의 'if-ne v0, v1, :cond_0'
    v0은 data() 함수의 리턴값인 현재 시간이, v1은 "2013-11-02-12:35:03" 값이 저장되어 있다.


    - 123 라인의 'if-ne v0, v1, :cond_0'
    v0은 Volume() 함수의 리턴값인 0x21(33)이, v1은 0x35(53) 값이 저장되어 있다.

     

    즉, 2개의 if-ne 문을 if-eq로 변경하면 cond_0으로 분기되지 않고, 진행될 것이다.

     

    [그림 9] 수정하기 전 스마일리 코드

     

    7. MainActivity.smali 파일의 if-ne 문을 if-eq로 변경하고, apktool 툴을 이용하여 리패키징 한다.

    아래 [그림 10]과 같이 if-ne 문을 if-eq로 변경한다.

     

    [그림 10] 수정된 스마일리 코드

     

    아래와 같이 apktool 툴을 이용하여 리패키징 한다.

    C:\Android\00.testapp\codeengn02> apktool b "SmartApp L02_smali" -o CodeEngn02.apk

     

    [그림 11] apktool을 이용하여 리패키징 수행

     

    [그림 12] 리패키징을 통해 생성된 apk 앱

     

    8. 새로 생성된 apk 파일에 signapk 개발자 서명키를 통해 서명한다.

    signapk.jar 파일을 이용하여 서명을 진행하며, 해당 폴더에 서명된 apk가 정상적으로 생성됨을 확인할 수 있다.

    C:\Android\04.apk-sign> java -jar signapk.jar testkey.x509.pem testkey.pk8 CodeEngn02.apk CodeEngn02_sign.apk

     

    [그림 13] 새로 생성된 apk에 개발자 서명 수행

     

    [그림 14] 개발자 서명이 수행되어, 새로 생성된 apk 파일

     

    9. 서명된 apk 파일을 안드로이드 에뮬레이터에 설치하여, 정상적으로 키 값을 출력되는지 확인한다.

    드래그 앤 드롭을 통해 설치 및 실행해보면, 아래와 같이 오류메시지가 확인된다.

     

    [그림 15] 개발자 서명까지 마친 apk가 지니모션의 에뮬레이터에 설치되지 않는 모습

     

    스마일리 코드 수정 후, 리패키징과 개발자 서명을 정상적으로 완료한 apk 파일이 지니모션의 에뮬레이터에는 정상적으로 설치가 되지 않았다.

    혹시 몰라서 녹스(Nox) 설치 후, apk 파일을 설치, 실행해보니 정상적으로 실행되는 것을 확인하였다.

    (지니모션에서 왜 안되는 지는 아직도 정확하게 확인하지 못했다.)

     

    정상적으로 실행되면, 아래 [그림 16]과 같이 키 값을 확인할 수 있다.

     

    [그림 16] 키 값 확인 모습

     

    여기까지 Mobile App Analysis L02 문제 풀이 끝!


    댓글

Designed by Tistory.