반응형

이번에는 Level 2를 풀어보자.

 

Level 2 앱을 다운로드하여 테스트 단말기에 설치한 후 실행한 모습이다.

 

 

역시나 루팅이 탐지되었다는 문구를 볼 수 있다.

 

이번 Level 2문제도 루팅을 우회해야만 진행할 수 있다.

 

따라서 static 분석을 하기위해  Level 2 apk 파일을 디컴파일 툴로 소스코드를 살펴 보자.

 

Level 2는 처음 시작하는 activitysg.vantagepoint.uncrackable2.MainActivity이다.

 

따라서 가장 먼저 sg.vantagepoint.uncrackable2.MainActivity인 부분을 살펴보자.

 

살펴본 결과 Level 1과 같이 b.a(), b.b(), b.c() 메소드에서 루팅 탐지를 하고 있는 것 같다는 느낌이 든다.

 

Level 1을 제대로 이해했으면 이런 느낌이 와야 한다. 

b.a() 메소드를 살펴보자.

 

 

Level 1과 똑같다.

 

하지만 이번에는 Level 1에서는 다른 방법으로 우회를 해보았다.

 

 

/sbin/su를 -> Level 2나 다른 문자열로 바꾼다면 해당 바이너리가 없기 때문에

 

return 값이 0이 될 것이다.

 

 

Level 1에서는 설명하지 않은

 

Build.TAGS.contains("test-keys")과 "/system/app/Superuser.apk ..."에 대해서는

 

조금만 검색하면 어떤 방식으로 루팅을 체크하는구나 감이 올 것이다.

 

검색하고 찾아보는 것도 실력을 키우는 것 중 하나이다.

 

따라서 Level 1에 대해서 100% 이해하고 넘어왔다면 루팅 우회는 금방 할 것이다.

 

같은 방법으로 우회해도 좋고 위의 방법대로 우회하든 정답은 없다.

 

그다음은 Level 1처럼 Secret String을 맞춰야 한다.

 

해당 메소드를 보자.

this.m.a(v4)이다.

 

v4는 우리가 입력한 string일 것이고 정확하게 비교하는 로직은 this.m.a에 있을 것이다.

 

this.m.a을 살펴보자.

 

this.m.a을 살펴보면 this.bar 메소드사용자가 입력한 String 값

 

byte형식으로 변환해서 bar 메소드로 넘겨준다.

 

bar 함수는 바로 밑에 정의가 되어있으며 내용은 아무것도 없다.

 

bar 메소드modifier을 살펴보면 native라는 것이 보인다.

 

nativejava에서 즉 앱단에서 처리하는 것이 아니라

 

c/c++을 이용해서 so 파일 안에서 처리하겠다는 의미이다.

 

자세한 내용은 여기(클릭)를 참조하자

 

따라서 이번 문제는 자바 앱단이 아닌 native 단 까지 분석을 진행해야 한다는 의미이다.

 

안드로이드에서 NDK를 사용하기 위해서는 so 파일을 load 시켜주는 과정이 꼭 필요하다.

 

 

load 시켜주는 과정이 위에서 빨간 박스 안에 System.loadLibrary("foo")이다.

 

libfoo.so 파일에서 this.bar라는 메소드가 정의되어 있으며

 

해당 메소드에서 이리저리 처리되고 반환 값만 자바단으로 retrun 해주는 형식이다.

 

사실문제의 의도와는 다르게 해당 this.bar 메소드를 후킹 해서 true로 반환해준다면

 

굳이 Secret String을 구하지 않고 밑의 그림처럼 해당 문제를 풀 수 있다.

 

 

하지만 이는 Level 2의 문제 출제 의도랑은 전혀 관련이 없다.

 

따라서 so 파일을 한번 분석을 해보자.

 

so 파일 대부분 lib 파일 안에 존재한다.

 

하지만 폴더가 4개나 있다.

 

이는 사용자가 어떤 OS bit를 가지고 있지 모르니 개발자가 모든 bit에서 실행할 수 있도록 한 것이다.

 

자신의 테스트 단말기의 bit는 다음과 같이 확인할 수 있다.

 

 

따라서 arm64-v8a 폴더로 가보면 libfoo.so 파일이 하나 있다.

 

이걸 분석을 해야 한다.

 

so 파일IDA로 분석을 진행한다.

 

IDA로 보면 Java_sg_vantagepoint_uncrackable2_MainActivity_init

 

Java_sg_vantagepoint_uncrackable2_CodeCheck_bar를 볼 수 있다.

 

이 둘 중 밑의 Java_sg_vantagepoint_uncrackable2_CodeCheck_bar 함수를 자세히 살펴봐야 한다.

 

그 이유는 Java_sg_vantagepoint_uncrackable2_CodeCheck_bar명에서 알 수 있듯이

 

bar가 들어가 있기 때문이다.

 

그렇다면 Java_sg_vantagepoint_uncrackable2_CodeCheck_bar 함수의 로직을 살펴보기 전에

 

컨셉을 잡아야 한다.

 

자세하게도 필요 없다.

 

크게 잡아도 된다.

 

나는 이번 문제를 풀 때 크게 2가지를 생각하고 분석에 들어갔다.

 

어떤 값을 return 하면  Secret String을 우회할 수 있을까?

 

또는 Java_sg_vantagepoint_uncrackable2_CodeCheck_bar에서 사용자가 입력한 Secret String 값과

 

Level 2에서 원하는 Secret String을 비교하는 로직이 있지 않을까?라는 큰 목표나 컨셉을 잡았고

 

이를 토대로 분석을 해보자.

 

 

코드를 보고 return result; 위주로 먼저 분석해보았다.

 

result는 처음에 0이라는 값을 가진다.

 

따라서 return이 0이면 우리가 원하는 Secret String을 찾았다는 메시지를 볼 수가 없다.

 

따라서 if문 안에 있는 result가 1이되게게끔 만들어주어야 한다.

 

물론 여기서 Java_sg_vantagepoint_uncrackable2_CodeCheck_bar 메소드의 return 값을

 

0이 아닌 1로 바꾸어도 문제는 풀 수 있다.

 

하지만 이는 출제자의 의도가 아니다.

 

따라서 if문 안에 있는 result에 (*(_QWORD *)v4 + 1368LL)라는 함수가

 

어떤 함수인지 어떤 역할을 하는지 알아봐야 한다.

 

이는 프리다로 후킹을 해서 확인해볼 수 있다.

 

 

확인해보니 ZN3art3JNI14GetArrayLengthEP7_JNIEnvP7_jarray라고 나온다.

 

여기서 유추해보자. ArrayLegnth이다.

 

(*(_QWORD *)v4 + 1368LL)함수는 뭔가 길이를 반환하는 함수인 거 같다. 

 

그리고 == 23이 붙어있는걸 보아하니

 

총길이가 23이 되어야 한다고 생각할 수 있다.

 

이 생각이 맞는지 검증하기 위해 strncmp의 함수를 살펴보자.

 

strncmp의 함수의 정의는 다음과 같다.

 

 

strncmp인자의 3번째 값으로 길이를 의미하는 23이 들어간 것으로 보아.

 

strncmp로 문제에서 원하는 String Secret 값과 내가 입력한 값이 23자리인지 확인한 다음

 

같다면 result1이 반환할 것이라고 예상할 수 있다.

 

따라서 strncmp를 후킹 하여 첫 번째 인자인 str1 인자를 찍어보면 내가 입력한 String

 

두 번째 인자 str2를 후킹 하면 문제에서 원하는 String이 들어가 있는 문자열이 나올 것이다.

 

이렇게 하면 Java_sg_vantagepoint_uncrackable2_CodeCheck_bar 함수를 분석하기 전에 생각했던

 

2가지의 컨셉을 만족할 수 있다.

 

후킹 코드를 작성해서 앱에서 12345678911234567892123을 입력한다.

 

후킹 코드가 제대로 동작하면

 

strncmp의 첫 번째 인자에 입력한 12345678911234567892123 값을 볼 수 있다.

 

그렇다면 문제에서 원하는 Secret String은 뭘까?

 

strncmp2번째 인자를 확인해보자.

 

이렇게 우리가 원하는 Secret String을 얻을 수 있다.

 

String을 문제에 넣어서 입력해보자.

 

 

이렇게 Level 2도 해결했다.

 

아마 많은 사람들의 풀이 방법을 보고 들어왔겠지만

 

대부분 루팅 우회를 할 때 exit를 후킹을 하는 방법이 많았다.

 

뭐 사실 틀린 말도 아니지만 실제 real world에서는

 

exit 함수로 하나로 루팅을 우회할 수 있는 경우는 거의 없다.

 

활용될 수는 있겠지만 절대 없다.

 

앱을 개발한 회사마다 또는 상황에 따라 보안 설루션들을 우회를 해야 하기 때문에

 

처음 연습할 때 습관을 잘 들이도록 하자.

반응형

'모바일 해킹 > AoS' 카테고리의 다른 글

[Mobile-CTF] KGB Messenger  (1) 2022.06.01
[UnCrackable AoS] Level 3  (0) 2022.03.24
[UnCrackable AoS] Level 1  (0) 2022.03.23
[Android] NDK란??  (0) 2022.03.09
[Android] Frida 설치  (0) 2022.01.23

+ Recent posts