FridaLab 문제 풀이 #4

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/

문제

❓ Send ‘frida’ to chall04()

분석

MainActivity 내 chall04 함수. str 인자를 받고 frida와 일치하는지 비교한 뒤 일치하면 플래그 값을 1로 설정해 주고 있음

별도 xrefs가 없어 Challenge 2 때와 같이 직접 호출해 줘야

후킹 코드

처음에 아래와 같이 Java.use를 써서 후킹해보았는데 attach가 잘 안 되었음. 그 이유가 무엇인가 알아보니, chall04 같은 경우 chall03과 달리 어디에서도 호출이 안 되다보니 메모리에 로드되지 않은 상태이기 때문이었음.

// 4
MainActivity.chall04.implementation = function (str) {
    send('call MainActivity::chall04 with: ' + str);
    this.chall04('frida');
}

그래서 onCreate에서 바로 호출되는 chall03 함수에서 chall04를 직접 호출하도록 하면 잘 동작

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

정리하자면 public/private/static 같은 키워드만으로 갈음할 수 없는 개념인 것 같음

  • Java.use의 경우 static 메소드이거나, xrefs가 있는 public 함수처럼 인스턴스가 없는 상황에서도 바로 직접 호출할 수 있는 함수를 후킹할 때 사용 가능
  • Java.choose의 경우 private 메소드이거나, xrefs가 없는 public 함수처럼 인스턴스가 있어야만 직접 참조 가능한 함수를 후킹할 때 사용 가능

최종적으로는 아래 코드와 같이 Java.choose 내에서 chall04 함수를 직접 호출해 주었음

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
    Java.choose('uk.rossmarks.fridalab.MainActivity', {
        onMatch: function (instance) {
            send('Found instance: ' + instance);

            // 2
            send('call MainActivity::chall02');
            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');**
        },
        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;
    };
});

실행 결과

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

0개의 댓글