제리의 블로그

Frida-Labs 0x1 본문

카테고리 없음

Frida-Labs 0x1

j3rrry 2024. 8. 17. 01:47

오늘은 Frida-Labs 의

Frida 0x1 을 풀어보겠습니다

 

그럼 ~~

레츠 꼬!!

 

 

Frida-Labs/Frida 0x1 at main · DERE-ad2001/Frida-Labs

The repo contains a series of challenges for learning Frida for Android Exploitation. - DERE-ad2001/Frida-Labs

github.com

 

1. 기능을 확인하기 ⚽

크게 3가지가 있다.

 

Enter the number 라는

TextView 가 있고. 1️⃣

 

입력 가능한

EditText 가 있고 2️⃣

 

Submit 이라고 적혀있고

클릭 가능한

Button 이 있다. 3️⃣

 

일단

Enter the number 는

숫자를 입력하라는 뜻이므로

숫자를 입력 후

버튼을 눌러보자 💪

`Try again` 이라는

문자열이 출력되는 것을 알 수 있었다.

그리고 저 창은

토스트창이라고 한다. 💬

 

이번엔

숫자가 아닌 값을 입력 후

버튼을 눌러보자 🤜

`Enter a vaild number !!` 라는

문자열이 출력되는 것을 알 수 있었다. 🗯️

 

이제 출력된 문자열과

구성요소들을 하나하나 찾아가볼까??

 

2. AndroidManifest.xml 에서 MainActivity 찾기 👁️‍🗨️

그 다음으로 해야할 것은

바로바로

 

 

MainActivity를 찾는 것!

 

 

jadx-gui 로

AndroidManifest.xml 을 확인해보면

<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>

 

위 두가지가 있는

activity 가

바로 MainActivity 이다.

 

예제에서는

`com.ad2001.frida0x1.MainActivity`로

이름 자체가

MainActivity 로 되어 있어서

찾기 쉽지만..

 

 

이름이 MainActivity가 아닐 수도 있기 때문에 ❕

action과 category가 MAIN, LAUNCHER 인

activity를 찾으면 된다.

 

그럼

jadx-gui에서

`com.ad2001.frida0x1.MainActivity`를

더블클릭하거나 ⏩

Ctrl+클릭하면

해당 activity를 볼 수 있다.

3. MainActivity 분석하기 🛠️

MainActivity에 와서

문자열 찾아본다.

 

 

`Enter a valid number !!` 정도는

물구나무 서서도 찾을 수 있었따.. 😎

            public void onClick(View view) {
                String obj = editText.getText().toString();
                if (TextUtils.isDigitsOnly(obj)) {
                    MainActivity.this.check(i, Integer.parseInt(obj));
                } else {
                    Toast.makeText(MainActivity.this.getApplicationContext(), "Enter a valid number !!", 1).show();
                }
            }

 

if 절을 보면

isDigitsOnly()

 

숫자만 왔는지 확인하는 메소드인 것을

짐작할 수 있었다.

 

즉, 숫자가 아닌 값이 포함되면

`Enter a vaild number !!` 를 출력하도록 만든 것이다.

 

그럼

숫자만 입력 했을 때

MainActivity.this.check() 를 분석해보자.

 

 

check에 커서를 두고

더블 클릭을 하면 ⏩

 

해당 선언문으로

갈 수 있다.

 

line 60 부터

check 선언문이다.

 

맨 처음에 기능을 확인할 때

토스트창으로 보았던

`Try again` 이 있는 것을 확인하였다.

 

    void check(int i, int i2) {
        if ((i * 2) + 4 == i2) {
            Toast.makeText(getApplicationContext(), "Yey you guessed it right", 1).show();
            StringBuilder sb = new StringBuilder();
            for (int i3 = 0; i3 < 20; i3++) {
                char charAt = "AMDYV{WVWT_CJJF_0s1}".charAt(i3);
                if (charAt < 'a' || charAt > 'z') {
                    if (charAt >= 'A') {
                        if (charAt <= 'Z') {
                            charAt = (char) (charAt - 21);
                            if (charAt >= 'A') {
                            }
                            charAt = (char) (charAt + 26);
                        }
                    }
                    sb.append(charAt);
                } else {
                    charAt = (char) (charAt - 21);
                    if (charAt >= 'a') {
                        sb.append(charAt);
                    }
                    charAt = (char) (charAt + 26);
                    sb.append(charAt);
                }
            }
            this.t1.setText(sb.toString());
            return;
        }
        Toast.makeText(getApplicationContext(), "Try again", 1).show();
    }

 

if 절을 보면

`(i * 2) + 4 == i2` 를 만족하면

그 아래 무언가 이루어지고 있고

 

그렇지 않으면

`Try again` 이 출력된다.

 

그렇기 때문에

 

if 절이

만족하려면

어떻게 해야하는지

알아보자. 😤

 

    void check(int i, int i2) {
        if ((i * 2) + 4 == i2) {

 

i 와 i2 는

check 메소드의

인자 값들이다.

 

 

첫 매개변수인 i 는

`get_random()` 값이고

 

`get_random()` 값은

    int get_random() {
        return new Random().nextInt(100);
    }

0~99 사이의 정수값이다.

 

그리고

두번째 매개변수인 Integer.parseInt(obj) 는

`editText.getText().toString()` 인데

 

이는

editText = 입력창에서

getText() = 텍스트를 가져와서

toString() = 문자열로 캐스팅한 값이라는 뜻이다.

 

즉, 입력한 문자열이

두번째 매개변수로 들어가게 된다.

 

다시 정리하자면

 

첫번째 매개변수는

0~99 사이의 값

 

두번째 매개변수는

입력값

 

그렇다면

첫번째 매개변수가 뭔지 알아야

입력값을 결정할 수 있게된다.

 

4. frida 로 get_random() 값 확인하기 💬

 

메소드에 커서를 두고

우클릭을 하면

'frida 스니펫으로 복사' 가 있다.

 

Java.perform(function() {
        let MainActivity = Java.use("com.ad2001.frida0x1.MainActivity");
        
        MainActivity.get_random.implementation = function () {
            console.log(`MainActivity.get_random is called`);
            let result = this["get_random"]();
            console.log(`MainActivity.get_random result=${result}`);
            console.log(`${result}` * 2 + 4);
            return result;
        };
});

get_random의 결과값 = 53

53 * 2 + 4 = 110

 

그럼 110을 입력하면?!

 

화면에

`FRIDA{BABY_HOOK_0x1}`

출력되고

 

`Yey you guessed it right` 도

토스트창으로

출력되었다.

 

5. 방법 정리 💯

1. 기능 확인 🧡

TextView, EditText, Button 의 구성과

각종 문자열들을 뽑아낸다.

 

2. MainActivity 찾기 💛

AndroidManifest.xml 에서 찾을 수 있다.

 

3. MainActivity 분석 💚

OnCreate 에서 액티비티가 실행될 때를 알 수 있다.

그리고 메인액티비티에서 각종 문자열들을 확인할 수 있었다.

 

4. frida 후킹 💙

분석 결과 `get_random()` 의 결과값을 알아야

입력값을 계산할 수 있었다.

jadx로 frida 스니펫을 만들어 썼다.

 

6. 나머지 💦

TextView, EditText, Button 정보에 대한 레이아웃을 알아보자.

 

onCreate 부분을 보면

R.layout.activity_main 을 확인할 수 있는데

이게 바로 액티비티의 레이아웃이다. 📃

 

 

res/layout/activity_main.xml

경로로 들어가보자.

 

그러면 TextView, EditText, Button 에 대한 정보가 나와있다.

 

자세히 하나하나 보다보면

`Enter the number` 라던지

`Submit` 등의 정보를 확인할 수 있다. 😆

 

다음은

onCreate 를 집중분석해보자.

    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.activity_main);	// res/layout/activity_main.xml
        
        // 입력창 EditText 선언
        final EditText editText = (EditText) findViewById(R.id.editTextTextPassword);
        
        // Button 선언
        Button button = (Button) findViewById(R.id.button);
        
        // TextView 선언
        this.t1 = (TextView) findViewById(R.id.textview1);
    }

다시보니

모든 구성요소에 대해서

선언되어 있네요..? 🙄

 

끝! ꉂ🤣‪‪‬‪

Comments