본문 바로가기
보안 및 개발/MOBILE

[Android] OWASP UnCrackable 3 미완료 ㅠ

by CH@3M 2020. 1. 21.

apk 다운로드 링크

JEB로 apk를 디컴파일해 MainActivity를 보자.

가장 먼저 눈에 띄는 것은 pizzapizzapizzapizzapizz 과 같은 xorkey string을 이용하고 있다는 것이다.

루팅탐지

다음과 같이 루팅을 탐지하고 showDialog() 함수를 이용하여 OK버튼 클릭 시, System.exit()함수를 호출하는 것을 알 수 있다.

 sg.vantagepoint.util의 RootDetection을 호출하는데, checkRoot 3가지 방법을 볼 수 있다.

package sg.vantagepoint.util;

import android.os.Build;
import java.io.File;

public class RootDetection {
    public RootDetection() {
        super();
    }

    public static boolean checkRoot1() {
        boolean v1 = false;
        String[] v3 = System.getenv("PATH").split(":");
        int v4 = v3.length;
        int v2 = 0;
        while(v2 < v4) {
            if(new File(v3[v2], "su").exists()) {
                v1 = true;
            }
            else {
                ++v2;
                continue;
            }

            return v1;
        }

        return v1;
    }

    public static boolean checkRoot2() {
        String v0 = Build.TAGS;
        boolean v1 = v0 == null || !v0.contains("test-keys") ? false : true;
        return v1;
    }

    public static boolean checkRoot3() {
        boolean v2 = true;
        String[] v1 = new String[]{"/system/app/Superuser.apk", "/system/xbin/daemonsu", "/system/etc/init.d/99SuperSUDaemon", "/system/bin/.ext/.su", "/system/etc/.has_su_daemon", "/system/etc/.installed_su_daemon", "/dev/com.koushikdutta.superuser.daemon/"};
        int v5 = v1.length;
        int v4 = 0;
        while(true) {
            if(v4 >= v5) {
                return false;
            }
            else if(!new File(v1[v4]).exists()) {
                ++v4;
                continue;
            }

            return v2;
        }

        return false;
    }
}

 

무결성 검사 

무결성 검사를 진행하는 verifyLibs 함수도 볼 수 있다.

mlogcat으로 보면 Tampering detected! Terminating...

 

Frida 및 xposed 탐지

IDA로 libfoo.so를 보면, frida 프로세스 검사 로직이 존재한다.

이를 우회하기 위해서 strstr() 함수를 후킹할 수 있다.

strstr() 함수의 구조는 다음과 같다.

char *strstr(const char *haystack, const char *needle)
{
  return strstr(haystack, needle);
}

 

 

 

CodeCheck 클래스를 보면 libfoo.so 함수로 입력한 값을 전달한다.

IDA의 CodeCheck 부분을 보면 다음과 같다.

반응형