기존에 Uncrackable3에 대해 분석하다가 이제서야 풀이를 올리네요

 

기존에 분석했던 내용은 아래에 있습니다.

https://taesun1114.tistory.com/entry/Uncrackable31?category=729990

 

Uncrackable3-1

저번에 Uncrackable3를 도전했었는데 당시에 다운받았던 앱이 오류가 있었던 건지 실행하면 바로 종료가 되어 분석을 하지 못했는데 며칠전 다시 다운받아 설치해보니 이번엔 잘돌아가네요 :) (당시에 앱 자체의..

taesun1114.tistory.com

앞서 프리다 및 xposed를 탐지하고 있고 루팅체크하는 것을 확인하였고, 돌아와서 소스코드를 확인해보면 this.check.check_code()를 통해서 문자열이 맞는지 확인하고 있습니다.

 

확인해보니 네이티브 함수를 호출하네요

 

libfoo.so파일 내 CodeCheck_bar함수를 기드라를 통해 분석해 보겠습니다.

첫번째 빨간 박스에서 무언가 하고 두번째 빨간 박스의 if문을 통해 문자열의 길이가 0x18이라는걸 알 수 있습니다.

 

첫번째 네모박스의 함수를 통해 문자열 혹은 키값을 생성한후 local_38이라는 변수에 저장해둔 후 3번째 네모박스의 함수에서 최종 문자열을 만들거나 비교를 하는 것으로 보이네요.

 

첫번째 네모박스 함수에 들어와서 분석해 보겠습니다. 뭔가 코드가 되게 긴걸 보실 수 있는데.... 

 

uVar1, uVar2, *puVar3을 통해 하는 행위는 분석을 어렵게 하기 위한 더미코드로 보여요(의미없는 행위들을 몇번이고 반복합다.)

 

더미코드라고 생각한 이유는 인자로받은 puParm1은 두고 로컬변수만 가지고 행위를 한 후 어디에 값을 넣는다던가 하는 행위가 없어서 더미코드라고 생각했습니다.

 

더미코드를 지나 쭉 내려오다보면 이제서야 puParm1에 무언가를 넣는코드를 보실 수 있습니다.

함수를 따라가 볼게요

 

함수를 통해 전달받은 uVar1과 0xb4와 xor연산을 한 후, 리턴해 주네요. 다시 함수를 따라가 봅니다.

 

xor하는 값만 다르고 계속 함수를 호출하는데요. 몇번이고 동일한 코드를 지나서 계속 함수를 따라 들어가다 보면.

 

최초에 0xe7을 리턴하는 것을 알 수 있습니다. 그러면 여기서부터 차례로 올라가볼게요 실력은 없고 시간은 많으니 이렇게라도 찾아볼게요

 

0xe7을 시작으로 xor해주면 다음과 같이 나옵니다.

 

이게 하나의 값이고 앞에서 보셨듯이 길이가 0x18(24)니까.. 24번 반복해주면 키값을 얻을 수 있어요 ....

 

소스코드에 보면 xorkey라는 값이 있는데 위에서 노가다로 획득한 키와 이값을 xor해줘야 됩니다.

 

다음과 같이 xor해주면 키값이 출력되는 것을 확인할 수 있습니다. 

 

프리다로 풀려고 했는데.. so파일 분석하다 보니 그냥 키값을 추출하게 되었네요....

저번에 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)는 아래에서 확인하시면 됩니다~

https://taesun1114.tistory.com/entry/Uncrackable3-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

frida를 이용해서 다른 스크립트 작성 중 검색을 통해 Uncrackable 실습앱을 발견하다보니, 순서가 뒤죽박죽이네요


Uncrackable 실습앱은 level3까지 나와있습니다

마지막인데.. 앱을 설치하고 실행하면 그냥 종료되네요 

처음엔 이것도 우회해야 하는 건가 싶어 한참을 헤맷으나 확인해보니 출제자 에러인 것 같습니다

DDMS를 통해 실행 후 로그를 확인해 봤습니다


로그를 확인하니 세그멘테이션 오류인 듯 합니다


디컴파일 후 소스를 확인해 보겠습니다



앱 분석 당시에는 그냥 출제자 에러인가 보다 하고 넘겼는데... 글을 작성하면서 소스를 보니 뭔가 verifyLibs에서 뭔가를 해주네요


일단 글작성후에 다시 분석을 해보도록 하겠습니다



분석할 당시에는 libfoo.so파일의 strncpy 함수를 호출할 때 인자로 NULL이 들어가서 세그멘테이션 에러가 발생한다고 생각했는데..


글 작성하면서 다시 보니, lib에 뭔가 조치를 해줘야 앱이 실행되는 걸까요? 조금 더 분석해 봐야 겠네요 :)



'Mobile' 카테고리의 다른 글

welcome to droid (codegate2018)  (2) 2018.02.11
INSTALL FAILED TEST_ONLY  (1) 2018.02.06
Uncrackable1 - frida  (4) 2018.01.30
Android에서 호출한 Class/Method 확인하기 - with Frida  (0) 2018.01.26
Uncrackable2 - Radare2  (0) 2018.01.23

+ Recent posts