Halo semuanya, pada kali ini gw akan membahas sebuah CTF Reverse Engineering, yang dimana targetnya disini adalah sebuah APK.

ketika apk tersebut di install maka akan muncul halaman input seperti ini, dan ketika kita masukan sebuah value contoh “test”

maka akan muncul pop up result: incorrect. Mari kita bedah aplikasinya dan kita lihat apa yang bisa kita dapatkan.
Gunakan https://github.com/skylot/jadx untuk melakukan reversenya

setelah kita buka dengan jadx, kita masuk ke bagian main activity dan disini bisa kita lihat bahwa program ini menggunakan JNI [ java native interface ] yang menggunakan library bernama setidaknya crackme
untuk mendapatkan dan melihat fungsi dari library tersebut, kita perlu melakukan decompile pada file apk nya, disini kita gunakan apktool untuk melakukan decompilenya

setelah sudah berhasil di decompile, kita masuk ke folder /lib/arm64-v8a

disini terdapat satu buah library .so dengan nama libcrackme.so. Next kita akan mendisassemblasi file .so tersebut dengan menggunakan ghidra https://ghidra-sre.org/

bisa kita lihat disini library sudah terbuka, disini kita bisa fokus pada bagian function FUN_0010f7c0. Fungsi singkatnya seperti ini
Fungsi FUN_0010f7c0 memproses string dari param_1, memverifikasi panjangnya, dan membandingkannya dengan nilai terenkripsi. Jika cocok, ia memilih nilai terenkripsi tertentu, memprosesnya, dan mengembalikan hasilnya. Jika terjadi perubahan memori yang mencurigakan, ia memanggil __stack_chk_fail().
nah setelah mengetahui fungsi ini, disini gw akan fokus pada bagian variable global yang di obfuscation
_DAT_0012f530, uRam000000000012f538, DAT_0012f540, DAT_0012f548

dengan key xor nya adalah 0xe54db1fd51d18f6f
Selanjutnya kita akan melakukan reverse xor pada value” tersebut dengan menggunakan simple python code ini
def decrypt_xor(encrypted_value, xor_key):
"""Membalik proses XOR untuk mendapatkan string asli."""
decrypted = encrypted_value ^ xor_key
return decrypted.to_bytes((decrypted.bit_length() + 7) // 8, 'big').decode(errors='ignore')
# Nilai hasil enkripsi (dari dekompilasi)
encrypted_values = [
0xd42586a23fe1f830, # uRam000000000012f538
0x907dc88636b0e329, # _DAT_0012f530
0xc46c829038e6d05a, # DAT_0012f540
0x8f12 # DAT_0012f548
]
# Kunci XOR yang digunakan dalam enkripsi
xor_key = 0xe54db1fd51d18f6f
# Melakukan XOR reversal
decrypted_strings = [decrypt_xor(val, xor_key) for val in encrypted_values]
# Menampilkan hasilnya
for i, val in enumerate(decrypted_strings):
print(f"[{i+1}] Decrypted Value: {val}")
setelah dijalankan kita mendapatkan hasilnya adalah
λ ~/ python3 exploit.py
[1] Decrypted Value: 1h7_n0w_ [ 0xd42586a23fe1f830, # uRam000000000012f538 ]
[2] Decrypted Value: u0y{galF [ 0x907dc88636b0e329, # _DAT_0012f530 ]
[3] Decrypted Value: !!3mi7_5 [ 0xc46c829038e6d05a, # DAT_0012f540 ]
[4] Decrypted Value: } [ 0x8f12 # DAT_0012f548 ]
nah hasil disini masih berantakan, kita akan coba susun sehingga menjadi value yang lebih relevant, dan setelah disusun kita dapatkan flagnya adalah Flag{y0u_w0n_7h15_7im3!!}