[안드로이드 모의해킹] 안드로이드 정적 분석 실습 Q1 part1

직접 연구하여 작성한 자료입니다. 공식 출처가 명시되지 않은 자료의 무단 복제, 사용을 금지합니다.
공격 기법은 학습용, 허가된 환경에서 실습 바랍니다. 실 운영망 대상 공격은 처벌받습니다. (정보통신망법 제48조 1항)

1. 개요

APK 정적 분석 과정을 거치면서 감은 잡혔지만 실습해보기 전까진 이게 맞는건지 확실하지 않을 수 있기 때문에 직접 앱개발과 분석 과정을 추가했다. 애플리케이션 레벨의 취약점은 개발자의 실수에서 야기되는 경우가 많기 때문에 직접 개발해보는 것이 필요하다. 직접 개발을 하면서 귀찮았던점, 느슨하게 처리한 부분이 실제 상용 앱에서도 동일하게 취약점이 발생할 가능성이 높다.

필자가 개발한 앱은 github(https://github.com/colfax0483/Vulnerable_apk)에 업로드 하였다. 프론트 엔드를 멋지게 꾸밀 재주는 없어 기본 제공하는 UI 리소스들을 사용했다. 업로드된 앱 중 첫번째 Q1. concat.apk 앱을 이용한다.

2. 앱 정적 분석

2-1. AndroidManifest.xml

apk 디컴파일 도구로 디컴파일 한 후 분석도구(jeb, jadx-gui 등)로 연다. 정적 분석 및 과정은 이전 포스트에서 다루었다.

2023.03.22 - [Security/Mobile] - [안드로이드 모의해킹] AndroidManifest.xml 분석하기

jeb - decompile APK

1. APK Package Name : com.learn.frida

2. App Permission : android.permission.INTERNET

3. Main Activity Name : com.learn.frida.MainActivity

별다른 특이사항(특수권한, Broadcasting, Activity, component, deeplink 등)이 없으니 식별된 첫 번째 MainActivity로 분석을 진행한다.

2-2. MainActivity.class

1. MainActivity.class 확인

2. Activity 생명주기 중 Activity가 생성되는 시점에 실행되는 메소드(onCreate) 분석

  1~2과정에 따라 앱 실행 - MainActivity 실행 - onCreate() 순서로 실행되는 것을 확인

3. 메소드 내에서는 순차실행되므로 sharedPreferences 클래스의 메소드(putString, apply 등)를 사용하여 문자열을 저장소에 저장하고 있음

개발에 사용한 코드를 참고(https://developer.android.com/training/data-storage/shared-preferences?hl=ko)하면 다음과 같다.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setTitle("com.learn.frida")
        setContentView(R.layout.activity_main)


        // Ensure the value is set before the button can be clicked
        val sharedPref = this.getPreferences(Context.MODE_PRIVATE)
        with(sharedPref.edit()) {
            putString(getString(R.string.savedString), "foobarstring")
            apply()
        }

        val btn_sharedprefs = findViewById(R.id.sharedPrefsButton) as Button
        btn_sharedprefs.setOnClickListener {
            val sharedPreferences = this.getPreferences(Context.MODE_PRIVATE)
            val stringValue =
                sharedPreferences.getString(R.string.savedString.toString(), "foobarstring")

            if (stringValue == "foobarstring") {
                Toast.makeText(this, "Instrumentation is not correct.", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "Instrumentation OK!", Toast.LENGTH_SHORT).show()
            }
        }

 

앱 설치

간단한 분석을 통해서 데이터를 저장하고 있음을 확인했으니, 앱을 실행해서 분석해봐야 한다.

adb 명령을 이용하여 앱을 설치한다.

앱 실행

앱 실행 시 버튼 3개(활성화 2개, 비활성화 1개)가 있으며, 각 버튼 순서대로 찾은 FLAG를 이어 붙이면 최종 플래그를 안내하고 있다.

1. SHAREPREFERENCES 버튼을 클릭하면, 정적분석에서 확인했던 메시지(Flag is Stored in SharedPerferences!)를 볼 수 있다.

앱 실행 후 분석

sharedpreferences는 단말기 내 /data/data/[APP ID]/shared_prefs/ 경로에 존재한다.

첫 번째 FLAG 식별

마치며

포스트 용량 관계로 Part 1~3 나누어서 포스팅 하였다.

직접 개발하고 분석해보는 것은 크기가 방대한 앱을 분석할 때, 분석 시간이 제한적인 환경에서 진단을 할 때 이러한 경험이 많은 도움이 된다.

 

 

반응형