[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.
Sekilas, tidak ada yang menarik dari aplikasi ini. Mari kita dekompilasi menggunakan JADX
.
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
.
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:
- Membuat instance untuk class
Checker
. - Menyetel
num1
menjadi1234
dannum2
menjadi4321
. - Dapatkan instance dari
MainActiviy
. - 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
Yey.. Kita berhasil mendapatkan flag.