Viblo CTF Contest 2020: Crypto

MISS AND DELETE

Challenge Category: Crypto
Difficulty:  không khó
Points: 234
Challenge Description:

Tired of working, Tuan fell asleep and forgot to lock his computer. Tuan suddenly woke up, he saw his draft deleted a few words. Unfortunately, Tuan only remembered the place of words that’s been deleted. Can you help Tuan to restore the words?

AES encrypt mode CBC
mess = 'Welcome to the Viblo CTF Contest'
key: 04e4841576fa288e4877c5b1e1f6[deleted]
encrypt: 3d[deleted]1ceccba0835d4cddef46de3e379ed79f9c96
IV: [deleted]

Đầu tiên cần biết  AES_CBC là gì? Có thể đọc qua ở đây.
Về cơ bản AES_CBC

https://asdcxsd.files.wordpress.com/2020/04/93c38-12xh1xpzjwfgg4ifgswtfsg.png

Từ độ dài của plaintext là 32 và độ dài của key đã biết là 14( sau khi decode hex đoạn đã biết)  có thể phỏng đoán độ dài key được dùng là 16 hoặc 32. Và mình quyết định độ dài là 16 :))  Suy ra sẽ có 2 block

màu xanh là đã biết còn đỏ là bị xóa

Nếu key là 16 thì bị thiếu mất 2 ký từ. Từ đây có thể brute force tìm ra 2 key đó => Theo như hình trên chỉ cần có key  là ra sẽ tìm ra được ciphertext của block 1

from Crypto.Cipher import AES
import re
een = "cba0835d4cddef46de3e379ed79f9c96"[-32:].decode('hex')
mess = 'Welcome to the Viblo CTF Contest'[-16:]

key = "04e4841576fa288e4877c5b1e1f6".decode('hex')
iv  = '0'*16

for i in range(256):
    for j in range(256):
            temp_key = key + chr(i) + chr(j)
            cipher = AES.new(temp_key, AES.MODE_CBC, iv)
            tmp = cipher.decrypt(mess+een).encode('hex')[-32:]
            x = re.search("^3d.*1cec$", tmp)
            if (x):
                print "Ok", tmp, temp_key.encode('hex')
                break
kết quả trả về

cipher01: 3dfb77bc98735c36f2f4974f2aff1cec
key: 04e4841576fa288e4877c5b1e1f6b2cf

Từ đó có thể tìm ra IV

key = "04e4841576fa288e4877c5b1e1f6b2cf".decode('hex')
encry  = "3dfb77bc98735c36f2f4974f2aff1cec".decode('hex')
mess2 = 'Welcome to the Viblo CTF Contest'[:16]
cipher = AES.new(key, AES.MODE_CBC, mess2)
tmp = cipher.decrypt(encry)
print tmp

Thực thi đoạn code và lấy được flag: Flag{ohoalala#a}

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.