FridaLab 문제 풀이 #7

wisdom·2024년 12월 27일
0

준비

  1. Android Studio + AVD (Pixel 5, API 31, x86_64)
    1. Download Android Studio
  2. frida, frida-server (16.2.1)
    1. https://github.com/frida/frida
  3. Jadx-gui
    1. https://github.com/skylot/jadx
  4. adb
    1. https://developer.android.com/tools/releases/platform-tools?hl=ko
  5. Fridalab.apk
    1. https://rossmarks.uk/blog/fridalab/

문제

❓ Bruteforce check07Pin() then confirm with chall07()

분석

MainActivity 내 chall07() 함수가 존재하고 여기서 check07Pin 함수를 호출해준 뒤 플래그 값을 설정함

    public void chall07(String str) {
        if (challenge_07.check07Pin(str)) {
            this.completeArr[6] = 1;
        } else {
            this.completeArr[6] = 0;
        }
    }

check07Pin은 전달 받은 문자열을 chall07 멤버변수와 비교. 이 값은 setChall07() 함수를 통해 랜덤 값으로 초기화 되는 문자열임

GPT에 물어보니 1000부터 9999까지의 값 중 랜덤한 정수를 뽑아 주는 코드라고 함

/* loaded from: classes.dex */
public class challenge_07 {
    static String chall07;

    public static void setChall07() {
        chall07 = BuildConfig.FLAVOR + (((int) (Math.random() * 9000.0d)) + 1000);
    }

    public static boolean check07Pin(String str) {
        return str.equals(chall07);
    }
}

아무튼 chall07 문자열은 onCreate 함수에서 setChall07 함수가 호출됨으로써 초기화됨

내가 해야 할 것은 check07Pin 함수를 1000부터 9999까지 호출해보면서 true가 반환될 때의 값을 MainActivity의 chall07 인자로 던져주면 됨

후킹 코드


Java.perform(function () {
    // 1
    var challenge_01 = Java.use('uk.rossmarks.fridalab.challenge_01');
    challenge_01.getChall01Int.implementation = function () {
        send('challenge_01::getChall01Int called');
        var result = this.getChall01Int();
        send('getChall01Int returned: ' + result);
        send('modified result: 1\n');
        return 1; // Or challenge_01.chall01.value = 1
    };

    // 2, 3, 4, 6
    Java.choose('uk.rossmarks.fridalab.MainActivity', {
        onMatch: function (instance) {
            send('Found instance: ' + instance);

            // 2
            send('call MainActivity::chall02\n');
            instance.chall02();

            // 3
            // instance.chall03.implementation = function () {
            //     send('call MainActivity::chall03');
            //     var result = instance.chall03();
            //     send('chall03 returned: ' + result);
            //     send('modified result: true\n');
            //     return true;
            // }

            // 4
            send('call MainActivity::chall04("frida")\n')
            instance.chall04('frida');

            // 6
            var challenge_06 = Java.use('uk.rossmarks.fridalab.challenge_06');
            challenge_06.confirmChall06.implementation = function (i) {
                send('call callenge_06::confirmChall06 with i: ' + i + '\n');
                send('timeStart: ' + this.timeStart.value);
                send('chall06: ' + this.chall06.value);

                send('call challenge_06:confirmChall06 with i: ' + this.chall06.value + '\n');
                var result = this.confirmChall06(this.chall06.value);
                return result;
            };

            send('sleep 10 seconds');
            Thread.sleep(10);

            send('call MainActivity::chall06');
            instance.chall06(10000);

            **// 7
            var challenge_07 = Java.use('uk.rossmarks.fridalab.challenge_07');
            send('brute force check07Pin');
            for (let index = 1000; index < 10000; index++) {
                var result = challenge_07.check07Pin(index.toString());
                if (result) {
                    send('check07Pin result: ' + index.toString());
                    instance.chall07(index.toString());
                }
            }**
        },
        onComplete: function () { }
    });

    // 3
    var MainActivity = Java.use('uk.rossmarks.fridalab.MainActivity');
    MainActivity.chall03.implementation = function () {
        send('call MainActivity::chall03');
        var result = this.chall03();
        send('chall03 returned: ' + result);
        send('modified result: true\n');
        return true;
    };

    // 5
    MainActivity.chall05.implementation = function (str) {
        send('call MainActivity::chall05 with str: ' + str);
        send('call MainActivity::chall05 with str: frida\n');
        this.chall05('frida');
    };

});

실행 결과

profile
보안, 개발, 일상을 기록합니다

0개의 댓글