[Imaginary CTF Round 12] – Arabica

Diberikan sebuah file .class java yang isinya bisa kita buka menggunakan decompiler online www.decompiler.com dan isinya:

Terdapat sebuah fungsi utama yang akan menunjukkan flagnya, dan 3 fungsi lain yaitu phase1(), phase2(), dan phase3(). Untuk phase1 dan phase2 bisa kita abaikan karena mereka berfungsi sebagai validator dan tidak memengaruhi bentuk flag.

Yang akan kita telusuri adalah phase3 karena hasil return dari inputan phase3 akan ditampung ke variabel baru di fungsi utama dan menjadi penunjuk flagnya.

Untuk phase3, saya mencoba merekonstruksinya dalam bentuk python (karena saya tidak begitu familiar dengan java) dan hasilnya kira-kira seperti ini:

Penjelasan code:

Pertama, di-declare sebuah variabel sebut saja A dengan nilai -1. Selanjutnya user akan diminta inputan dan jika hasilnya sama dengan A (-1), maka akan langsung di-return 0. Namun jika beda, nilai b akan menyimpan nilai awal inputan, lalu inputan akan dikali 2 dan ditambah 1. Jika hasilnya sama dengan A (-1), maka akan direturn nilai B (nilai awal inputan) dan jika beda akan direturn 0. Jadi jika kita ingin fungsi ini tidak me-return 0, kita harus mencari nilai c (inputan) di mana 2*c + 1 = -1 dan c != -1.

untuk fungsi Main hasil rekonstruksinya kira-kira seperti ini:

Melihat dari code fungsiMain ini, kita hanya perlu menemukan hasil dari return phase3 yang tidak bernilai 0 dan flag sudah bisa kita dapatkan karena kalau hasilnya 0, fungsiMain tidak akan berjalan. Kembali lagi supaya hasilnya tidak 0, maka yang harus kita lakukan adalah mencari nilai c (inputan) di mana 2*c + 1 = -1 dan c != -1

Jika kita cari nilai c nya, maka c = -2/2 = -1, sedangkan c tidak boleh -1. Nah di sini kita akan menggunakan keuntungan dari batasan nilai integer, yaitu 2147483647.

Batasan nilai ini sifatnya akan berputar, jadi misalnya kita punya sebuah variabel integer bernilai 2147483647 jika kita +1 maka hasilnya adalah -2147483648, jika kita +2 hasilnya -2147483647, jika +3 hasilnya -2147483646, dan seterusnya.

Nah dengan pendekatan ini nilai 2147483647 jika kita masukkan ke rumus 2*c + 1 maka kita mendapat hasil -1. Tinggal fungsi Main tadi kita jalankan dengan menambahkan variabel A senilai 2147483647 dan flag bisa kita dapatkan.

fFlag: flag{i_4ctU411y_l1k3_T34_m0R3!}

Leave a Reply

Your email address will not be published. Required fields are marked *