TMUCTF 2021 – 435!

challenge.py

Summary:

Sebuah plaintext terdiri dari kalimat “CBC (Cipher Blocker Chaining) is an advanced form of block cipher encryption” disambung dengan 10 byte pertama hasil hash SHA256 dari KEY. Plaintext tersebut diencrypt dengan algoritma AES metode CBC (Cipher Block Chaining). Kita diberikan sebagian plaintext (sebagian lagi merupakan hasil hash dari KEY), serta KEY dan ciphertext yang beberapa karakternya sengaja dihilangkan. Flagnya bisa kita dapatkan dengan menemukan IV (Initialization Vector) kodingan tersebut.

Cara kerja AES CBC

Mode operasi penyandian blok - Wikipedia bahasa Indonesia, ensiklopedia  bebas
  1. Untuk Encrypt, plaintext akan dibagi terlebih dahulu menjadi beberapa bagian/block (pada soal ini, tiap blocknya terdiri dari 16 bytes Plaintext).
  2. Block Plaintext pertama akan di-XOR dengan serangkaian bytes yang disebut IV (Initialization Vector).
  3. Hasil XOR akan di-encrypt dengan sebuah KEY, didapatkan block Cipher pertama.
  4. Block Plaintext kedua akan di-XOR dengan block Cipher pertama, lalu di-encrypt. Didapatkan block Cipher kedua.
  5. Block Plaintext ketiga akan di-XOR dengan block Cipher kedua, lalu di-encrypt. Didapatkan block Cipher ketiga. Begitu seterusnya hingga seluruh Plaintext ter-encrypt.
  6. Sambungkan semua Block Ciphertext dari yang pertama sampai terakhir, didapatkan ciphertext lengkap.

Lalu untuk Decrypt bagaimana? Tinggal kita balik saja prosesnya:

Kita mulai dari Block Cipher terakhir, Block tersebut akan di-decrypt dengan sebuah KEY, hasilnya kita XOR dengan Block Cipher urutan sebelumnya. Didapatkan Block Plaintext urutan terakhir. Ulangi terus hingga sampai ke Block Cipher pertama, kita decrypt, XOR dengan Initialization Vector, dan dapatkan Block Plaintext pertama. Sambungkan semua Block Plaintext dari yang pertama sampai terakhir, didapatkan plaintext lengkap.

Penyelesaian soal

Barusan kita tahu bahwa proses Decrypt menghasilkan Plaintext dari Block-block Ciphertext dan Initialization Vector yang di-XOR. Nah karena kita diberikan Ciphertext, bisakah kita mencari tahu nilai IV serta block-block ciphertext yang hilang? Tentu saja bisa, dengan prinsip XOR (a^b = c maka a^c = b). Untuk KEY karena hanya 3 karakter yang hilang, tinggal kita lakukan bruteforce untuk menemukannya dan secara bersamaan kita juga mem-brute force sebagian Plaintext yang tidak diberitahu.

Pertama-tama kita pecah dulu Plaintext dan Ciphertext per 16 byte.

Untungnya Block Cipher terakhir (C6) diberikan secara utuh, jadi mempermudah kita dalam melakukan Bruteforce. Block C6 ini akan kita decrypt dengan KEY yang kita Brute Force, di-XOR dengan Block Plaintext terakhir (P6) dan jika potongan “9f43fd6634” dari C5 ada pada hasil XOR, maka KEY bisa kita temukan dan operasinya berada di arah yang benar. Gunakan kodingan berikut:

*catatan:

  • Nilai IV saya isi dengan b”\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00″ agar hasil fungsi decrypt tidak berubah karena di-XOR.
  • Ori dimulai dari index 80 ke ujung sebagai index dari Block Plaintext P6

hasilnya:

Yes! ternyata dengan KEY 0XhN2!8d%8Slp3Ov kita menemukan nilai lengkap Block Cipher C5, yaitu 9c1a9d16795c1b334d6ec49f43fd6634. Nah dari sini kita tidak perlu lagi melakukan brute force, cukup lakukan metode:

  1. Decrypt Block Cipher ke-n dengan KEY yang sudah ketemu
  2. Hasil Decrypt di-XOR dengan Block Plaintext ke-n
  3. Didapatkan Block Cipher ke-(n-1).

Lakukan metode tersebut dan didapatkanlah Block-Block Ciphertext fullnya seperti ini:

Ketika sampai di Block Cipher C1, proses rekonstruksi akan memberikan nilai Initialization Vector (alias flag yang dicari) yaitu 5930555f4433437259503733445f3137. Ubah dari hex menjadi ascii, dapatkan flagnya Y0U_D3CrYP73D_17.

FULL Codingan:

Output:

Flag: TMUCTF{Y0U_D3CrYP73D_17}

Leave a Reply

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