[SlashRoot CTF 2019] – Android

Diberikan sebuah file ‘CrackMe102.apk‘. Namun untuk mengetahui Algoritma dari apk tersebut, ada 2 cara, yaitu extract dengan menggunakan Apktool atau dengan JADX (http://www.javadecompilers.com/apk).

Pada kasus ini, saya memilih untuk mengextract apk tersebut menggunakan JADX, agar source code yang dipakai untuk membuat apk tersebut berkemungkinan dapat dibaca. Berbeda ketika kita menggunakan Apktool, maka extract yang yang dihasilkan banyak berbentuk ‘.smali’ yang sulit untuk dibaca.

Setelah saya mengextract  file apk tersebut, terdapat 2 buah file yaitu sources dan resources,

Secara default biasanya resource hanya mengandung asset-asset yang dibutuhkan dalam apk tersebut, sedangkan sources merupakan isi dari code apa yang dijalankan, maka ktia bisa mencari source codenya pada folder source. Setelah mencari kurang lebih 5 menit, ternyata source code terdapat pada folder ini:

Terdapat 6 file java, yang dijalankan oleh apk. Namun seperti halnya coding, kita bisa memulai dari analisa apa isi dari ‘MainActivity.java’ karena code tersebut seharusnya merupakan function main() dalam apk tersebut.

Setelah dilihat, ternyata benar bahwa ada code yang dijalankan sebelum print flag, seperti berikut:

Dapat diartikan pada fungsi if yang tertera, yaitu mengambil value string dari input form, lalu di lempar kedalam fungsi ‘CheckAnswer()’. Lalu, jika fungsi tersebut mereturn nilai true, maka flag akan tercetak. Untuk mengetahui lebih lanjut kita dapat melihat file ‘CheckAnswer.java’ yang tertera dalam folder yang sama. Berikut isi dari file tersebut,

Ternyata proses check tersebut menggunakan constraint yang cukup banyak, sehingga kita akan kesulitan untuk memcahkan constraint-constraint tersebut. Pada kasus ini, saya mencoba membuat z3-solver script untuk menyelesaikan constraint tersebut.

Namun ada sedikit kendala dimana kita tidak menemukan panjang flag/char yang dimaksud. Disana tertulis bahwa “this.text.trim().length() != Integer.valueOf(this.context.getString(C0264R.string.num_char)).intValue()“. Dari tulisan tersebut, kita dapat mengetahui bahwa panjang string terdapat pada variable num_char pada file ‘C0264R.java’, namun ketika dibuka, num_char tersebut tidak memberikan informasi panjang.

Karena mustahil bahwa panjangnya akan 2131492896, maka kita harus mencari file string, seperti yang tertulis pada “/* renamed from: id.slashrootctf.crackme102.R$string */“, dimana yang berarti ada file string dalam folder crackme102 tersebut.

Selanjutnya kita harus mencari file string tersebut, dan yang paling memungkinkan adalah di resource, karena string yang disimpan pada source hanya merupakan id dari variable tersebut, untuk memanggil variable tersebut di resource. Kurang lebih 30 menit melakukan pencarian secara manual. Akhirnya file string ditemukan,

Sehingga kita dapat melihat panjang char yang sebenarnya,

Pada file string tertulis bahwa num_char memiliki nilai 29, yang berarti, panjang flag/char tersebut adalah 29 karakter. Kita sekarang sudah dapat membuat code z3nya dengan constraint-constraint yang ada, berikut code yang saya buat:

Kita tinggal menjalankan code tersebut untuk memenuhi semua aturan dari constraint tersebut.

ternyata string yang dibutuhkan adalah T581Y-KOXCC-JHK0Z-9J77Y-DF2LF.

Untuk memastikan benar/salahnya, kita dapat menginstall apk tersebut pada smartphone kita masing-masing, lalu masukan serial tersebut. Hasilnya:

Flag: SlashRootCTF{T581Y-KOXCC-JHK0Z-9J77Y-DF2LF}

Leave a Reply

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