COMPFEST13 – You AES Me Up

chall.py:

Summary

Seperti yang bisa kita lihat, codingan ini memberikan 3 pilihan yang bisa kita gunakan. Fitur pertama akan mem-print hasil enkripsi flagnya lewat fungsi khusus get_flag(). Fitur kedua memperbolehkan kita meng-encrypt string kita sendiri dengan key & IV yang sudah ditentukan oleh codingan. Fitur ketiga memperbolehkan kita men-decrypt encrypted text dengan key & IV yang juga sudah ditentukan oleh codingan. Key & IV berasal dari hasil os.random(16), jadi tiap session tentu akan berbeda.

Analisa get_flag()

Pertama, flag akan di-enkripsi metode AES_ECB dengan kuncinya menggunakan nilai IV. Setelah itu, hasil enkripsi ECB akan dibagi menjadi beberapa block berisi 16 byte, lalu tiap blocknya akan di-enkripsi metode AES_CBC dengan IV yang berubah-berubah. IV ini berasal dari hasil XOR antara block Plaintext (flag) dan block Ciphertext putaran sebelumnya. Jadi kira-kira penggambarannya seperti ini:

Cipher1 = [encrypt(Plain1, key, IV) di mana IV = default IV

Cipher2 = [encrypt(Plain2, key, IV1) di mana IV1 = Plain1 Cipher1

Cipher3 = [encrypt(Plain3, key, IV2) di mana IV2 = Plain2 Cipher2

Nah, karena hasil-hasil enkripsi block-block tersebut didasarkan pada hasil enkripsi block sebelumnya, maka kita harus memecahkannya dari block enkripsi pertama, yang masih menggunakan default IV sebagai IV nya.

Mencari Default IV

Saya menggunakan referensi https://github.com/joshuahaddad/CTF_WriteUps/blob/master/SwampCtf/swampThreeKeys.md untuk mencari IV-nya, yang mana di situ dijelaskan bahwa kita bisa mencari nilai IV dari custom plaintext dan hasil dekripsi dari plaintext tersebut. codingannya kira-kira seperti ini:

Output:

Oke, default IV sudah didapatkan, tinggal kita cari cara mendecrypt setiap block Ciphernya. Di sini kita akan memanfaatkan fitur ketiga yang sudah disediakan program, yaitu fitur decrypt. Untuk block Cipher pertama, dekripsi berjalan dengan aman dan kita juga bisa mendapatkan iv dari enkripsi selanjutnya.

Namun masalahnya, bagaimana kita melakukan dekripsi apabila IV yang digunakan dalam proses enkripsi Block Cipher2 berbeda dengan IV yang digunakan dalam fitur decrypt codingan (yang masih menggunakan default IV)? Mari kita lihat lagi proses dekripsi AES_CBC:

Plaintext = decrypt(message, KEY, IV)

Plaintext = decrypt(message, KEY) IV

Objektif kita adalah men-XOR hasil dekripsi bukan dengan default IV, melainkan dengan newIV yang didapat dari block cipher block plaintext putaran sebelumnya. Maka dari itu, kita gunakan default IV yang sudah kita dapat untuk “menghapus” efek XOR bawaan dari fitur decrypt dan kita XOR lagi dengan newIV yang kita punya.

Plaintext = (decrypt(message, KEY) IV) IV newIV

Plaintext = decrypt(message, KEY) newIV

Nah, tinggal tambahkan operasi ini ke kodingan dan lakukan sampai ke block cipher terakhir. Dapet deh flagnya

Full solve:

Flag = COMPFEST13{y0u_aes_me_UpPpppPp_____t0_c0d3_on_st0rmy_Sea4aA5____e0212d1a34}

Leave a Reply

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