저번에 Uncrackable3를 도전했었는데 당시에 다운받았던 앱이 오류가 있었던 건지 실행하면 바로 종료가 되어 분석을 하지 못했는데
며칠전 다시 다운받아 설치해보니 이번엔 잘돌아가네요 :) (당시에 앱 자체의 오류가 맞았을까요....)
앱 실행 시 위와 같이 루팅감지되어 바로 종료가 됩니다
디컴파일 후에 소스코드를 보면
MainActivity의 onCreate부분에서 루팅체크하는걸 볼 수 있습니다
루팅체크로직을 따라가 보면
다음과 같은걸 볼 수 있는데 저는 Supersu를 사용해서 위 로직에서 탐지가 된듯합니다
간단하게 Frida를 이용해서 우회해 보겠습니다.
jscode = """
Java.perform(function() {
console.log("[*] Hooking calls to System.exit");
root1 = Java.use("sg.vantagepoint.util.RootDetection");
root1.checkRoot1.implementation = function() {
console.log("[*] checkRoot1 Hook");
return false;
}
root1.checkRoot2.implementation = function() {
console.log("[*] checkRoot2 Hook");
return false;
}
root1.checkRoot3.implementation = function() {
console.log("[*] checkRoot3 Hook");
return false;
}
});
"""
후킹 스크립트는 위와 같이 간단하게 탐지가 되어도 false를 리턴하게 작성하였습니다
실행해보면...
다음과 같이 에러가 나는데요 여기서 왜 에러가 나는지 몰라 한동안 깊은 삽질을 했네요 :(
결론은 MainActivity에서 libfoo.so파일을 호출해서 native코드를 실행하는데 .so파일의 경우 로드될때 .init_array가 먼저 실행된다고 합니다
그럼 .so파일의 .init_array를 살펴보겠습니다 ida에서 Control + S를 눌러 확인이 가능합니다
Ctrl + S를 이용하여 .init_array를 확인해 보면
아래 그림과 같이 offset sub_8D50을 호출하는 것을 알 수 있습니다
sub_8D50으로 들어가면 pthread_create를 이용한 anti-debugging 기법같은데요 thread가 생성되며 호출되는 함수(sub_8BC0)를 살펴보겠습니다
이 함수안에보면 메모리를 읽어 frida와 xposed를 확인하는 루틴이 존재하네요 ㅠㅠㅠ
frida를 이용해서 후킹하려고 하면 여기서 탐지되어 강제로 종료되는 것을 확인할 수 있습니다
android_log_print를 보면 37942자리에 있는 값을 ddms에 로그로 띄워주는 것 같네요
37942 = 0x9436이므로 해당 주소로 가보면
탐지될 경우 UnCrackable3에 Tampering dtected! Terminating...이라고 출력될 것 같네요
ddms로 로그를 확인해보면 프리다로 실행시켰을 경우, 다음과 같이 탐지되는 것을 볼 수 있습니다
하나로 끝내려고 했는데 너무 길어져서 다음에 이어 작성해야겠네요 ;)
Uncrackable3-2로 끝내겠습니다 :)
문제 풀이(3-2)는 아래에서 확인하시면 됩니다~
'Mobile' 카테고리의 다른 글
apktool first type is not attr (0) | 2018.10.04 |
---|---|
Android Proxy Burp 인증서 설치 (2) | 2018.09.15 |
APK IDA로 동적디버깅 (0) | 2018.02.22 |
welcome to droid (codegate2018) (2) | 2018.02.11 |
INSTALL FAILED TEST_ONLY (1) | 2018.02.06 |