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 부분을 보면 다음과 같다.
반응형
'보안 및 개발 > MOBILE' 카테고리의 다른 글
[Android] apktool을 이용한 디컴파일 및 리패키징 (0) | 2020.02.10 |
---|---|
[Android] SuCTF 2014 Reverse200 (0) | 2020.01.29 |
[Android] OWASP UnCrackable 2 (0) | 2020.01.20 |
[Android] OWASP UnCrackable 1 (0) | 2020.01.17 |
[Android] frida hooking 연습 문제 (0) | 2020.01.16 |