Post

[Frida Labs] 06 - Invoking a Method with an Object Argument

Dalam kesempatan ini, kita akan mempelajari cara memanggil metode dengan argumen objek menggunakan Frida.

Sebagai studi kasus, kita akan menerapkannya pada aplikasi Challenge 0x6.apk, yang bisa diunduh dari sini.

0x1 - Prerequisites

  • Dasar reverse engineering menggunakan JADX.
  • Kemampuan untuk memahami kode Java.
  • Kemampuan untuk menulis kode Javascript.
  • Familiar dengan ADB.
  • Perangkat Android yang sudah di-root.

0x2 - Challenge 0x6

Mari kita jalankan aplikasinya.

Aplikasi Challenge 0x6 Aplikasi Challenge 0x6

Sekilas, tidak ada yang menarik dari aplikasi ini. Mari kita dekompilasi menggunakan JADX.

Class MainActivity Class MainActivity

Ini mirip seperti tantangan sebelumnya. Dalam kasus ini, metode get_flag() tidak pernah dipanggil oleh aplikasi.

Jika kita perhatikan, metode get_flag() memiliki satu argumen, yang mana ini adalah instance dari class Checker. Argumen ini diberi nama A.

1
2
3
public void get_flag(Checker A) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    // Method body
}

Di dalam metode tersebut, terdapat pemeriksaan apakah A.num1 sama dengan 1234 dan A.num2 sama dengan 4321. Jika kondisi ini terpenuhi, aplikasi akan mendekripsi flag dan menampilkannya di TextView.

Mari kita periksa class Checker.

Class Checker Class Checker

Di dalam class Checker terdapat dua variabel, yaitu:

  • num1
  • num2

num1 harus bernilai 1234 dan num2 harus bernilai 4321 untuk kita bisa mendapatkan flag.

0x3 - Solution

Sangat mudah untuk menyelesaikan tantangan ini, karena kita sudah melakukan hal serupa sebelumnya. Hanya saja kali ini terdapat perbedaan, yaitu argumen metode get_flag adalah objek dari class Checker.

Berikut adalah langkah-langkah yang akan kita lakukan:

  1. Membuat instance untuk class Checker.
  2. Menyetel num1 menjadi 1234 dan num2 menjadi 4321.
  3. Dapatkan instance dari MainActiviy.
  4. Panggil metode get_flag menggunakan insance sebagai argumen.

Mari kita buat script-nya.

Pertama, kita buat insance untuk class Checker.

1
2
var checker = Java.use("com.ad2001.frida0x6.Checker");
var checker_obj  = checker.$new();  //Class object

Lalu, atur nilai dari variabel num1 dan num2.

1
2
3
4
5
if (1234 == A.num1 && 4321 == A.num2) {
	........
	........
	........
}
1
2
checker_obj.num1.value = 1234;
checker_obj.num2.value = 4321;

Sekarang, dapatkan instance MainActivity. Untuk melakukan ini gunanakan API Java.performNow dan Java.choose seperti di tantangan sebelumnya.

1
2
3
4
5
6
7
8
Java.performNow(function(){
    Java.choose('com.ad2001.frida0x6.MainActivity', {
      onMatch: function(instance) { 
        console.log("Instance found");
      },
      onComplete: function() {}
    });
});

Gabungkan script-nya dengan instance dari class Checker.

1
2
3
4
5
6
7
8
9
10
11
12
13
Java.performNow(function(){
    Java.choose('com.ad2001.frida0x6.MainActivity', {
      onMatch: function(instance) { 
        console.log("Instance found");

        var checker = Java.use("com.ad2001.frida0x6.Checker");
        var checker_obj  = checker.$new();  //Class object
        checker_obj.num1.value = 1234; //num1
        checker_obj.num2.value = 4321; //num2
      },
      onComplete: function() {}
    });
});

Terakhir, kita tinggal memanggil metode get_flag dengan memasukan instance dari class Checker sebagai argumennya.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Java.performNow(function(){
    Java.choose('com.ad2001.frida0x6.MainActivity', {
      onMatch: function(instance) { 
        console.log("Instance found");

        var checker = Java.use("com.ad2001.frida0x6.Checker");
        var checker_obj  = checker.$new();  //Class object
        checker_obj.num1.value = 1234; //num1
        checker_obj.num2.value = 4321; //num2
        instance.get_flag(checker_obj) //invoking the get_flag method
      },
      onComplete: function() {}
    });
});

Jalankan script Frida-nya.

1
➜ frida -U -f com.ad2001.frida0x6

Berhasil Mendapatkan Flag Berhasil Mendapatkan Flag

Yey.. Kita berhasil mendapatkan flag.

This post is licensed under CC BY 4.0 by the author.