Writeup ReUse

SlashRoot 4.0 Quals

Posted by rmn0x01 on Thursday, October 31, 2019

Soal kategori Kriptografi dengan poin 100, salah satu soal yang muncul pada gelombang pertama penyisihan Slashroot 4.0

Intro

File yang diberikan berupa

$ file ReUse.zip 
ReUse.zip: Zip archive data, at least v1.0 to extract
$ unzip ReUse.zip 
Archive:  ReUse.zip
 extracting: ENV.py.encrypted        
  inflating: file.decrypted.zip      
  inflating: file.zip.encrypted      
  inflating: ReUse.py                          

TLDR

  1. XOR
  2. Get the flag

Full Steps

Penjelasan dari keempat file yang diberikan adalah:

  • ENV.py.encrypted : File ENV.py yang terenkripsi
  • file.decrypted.zip : File ZIP original
  • file.zip.encrypted : File file.decrypted.zip yang terenkripsi
  • ReUse.py : Script enkripsi

Isi dari script enkripsi adalah:

ReUse.py

import ENV
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad

def encrypt(filename):
    with open(filename, "r") as f:
        data = pad(f.read(), ENV.SIZE)

    aes = AES.new(ENV.KEY, AES.MODE_OFB, ENV.IV)

    with open(filename + ENV.EXTE, "w") as f:
        f.write(aes.encrypt(data))

    print filename + ENV.EXTE

def decrypt(filename):
    with open(filename, "r") as f:
        data = f.read()

    aes = AES.new(ENV.KEY, AES.MODE_OFB, ENV.IV)
    ext = filename.split(".")
    name = ext[0] + ENV.EXTD + ext[1]

    with open(name, "w") as f:
        f.write(unpad(aes.encrypt(data), ENV.SIZE))

    print name

def main():
    encrypt("file.zip")
    decrypt("file.zip.encrypted")
    encrypt("ENV.py")

if __name__ == '__main__':
    main()

Dari script yang diberikan, diketahui bahwa algoritma enkripsi yang digunakan adalah Advanced Encryption Standard Mode Output Feedback (AES OFB). Sedangkan dari file yang diberikan, diketahui bahwa script tersebut telah digunakan untuk mengenkripsi dua file dengan key dan IV yang sama, sesuai dengan judul soal ReUse. Tujuan pengerjaan adalah untuk mendapatkan kembali file ENV.py dari ENV.py.encrypted.

AES termasuk dalam block cipher, dimana plaintext dibagi menjadi beberapa blok yang kemudian masing-masing blok tersebut akan dienkripsi. Skema enkripsi-dekripsi dari AES-OFB adalah sebagai berikut[1]: skema enkripsi aes-ofb skema dekripsi aes-ofb

Pada skema enkripsi dan dekripsi, yang melalui blok enkripsi adalah key dan IV, baru kemudian di-XOR dengan blok dari plaintext atau ciphertext (tergantung sedang melakukan enkripsi atau dekripsi). Dengan informasi ini, diketahui bahwa dapat dilakukan dekripsi terhadap suatu cipher apabila telah dimiliki pasangan plaintext-ciphertext yang telah dienkripsi menggunakan key dan IV yang sama tanpa perlu mengetahui key dan IV-nya dengan cara melakukan operasi XOR pada pasangan tersebut, dan hasil XOR kemudian di-XOR-kan kembali dengan ciphertext yang ingin didekripsi. Dalam soal ini, pasangan plaintext-ciphertext adalah file file.decrypted.zip dan file.zip.encrypted, sedangkan file yang akan didekripsi adalah ENV.py.encrypted. Script solver-nya adalah:

solver.py

from pwn import *

f = open('file.zip.encrypted','r').read()
g = open('file.decrypted.zip','r').read()
h = xor(f,g)
i = open('ENV.py.encrypted','r').read()
j = xor(h,i)
print('a')
k = open('ENV.py','wb+')
k.write(j)
k.close()

File ENV.py berisi

$ strings ENV.py
EXTD = ".decrypted."
EXTE = ".encrypted"
FLAG = "SlashRootCTF{S3K4L1_p4k3_4J4_2185d97b1f4ffc49e9f353a78792deb0}"
IV = "iloveu3aca4c0412"
KEY = "ILOVEYOU37a283d1"
PDF = "ILOVEYOU3000"
SIZE = 16
ZIP = "iloveu123"
&,V3
IujjA
CJ]5
(...)
-Vbc
8LRl

Flag

SlashRootCTF{S3K4L1_p4k3_4J4_2185d97b1f4ffc49e9f353a78792deb0}

References

  1. https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Output_Feedback_(OFB)
  2. http://web.eecs.utk.edu/~jysun/files/Lec4.pdf