iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
Security

資安小白的密碼學從0到1-CryptoHack平台解題紀錄系列 第 25

【Day 24】Symmetric CryptoGraphy06 - ECB_CBC_WTF

  • 分享至 

  • xImage
  •  

前言

今天一樣解一題就好,這題的目的主要為了解CBC的流程,還有它跟ECB的差別,了解後這題就迎刃而解惹!(是這樣用對吧)
https://ithelp.ithome.com.tw/upload/images/20231005/20162613RAbIZdbJL0.png

Writeup

ECB CBC WTF

剛看到這題的時候我也wtf

題目

網址 : https://aes.cryptohack.org/ecbcbcwtf/
https://ithelp.ithome.com.tw/upload/images/20231004/20162613wPZWFwBgcG.png

思路

一樣先點進題目網址 : https://aes.cryptohack.org/ecbcbcwtf/

  • source code
from Crypto.Cipher import AES
KEY = ?
FLAG = ?
@chal.route('/ecbcbcwtf/decrypt/<ciphertext>/')
def decrypt(ciphertext):
    ciphertext = bytes.fromhex(ciphertext)
    cipher = AES.new(KEY, AES.MODE_ECB)
    try:
        decrypted = cipher.decrypt(ciphertext)
    except ValueError as e:
        return {"error": str(e)}
    return {"plaintext": decrypted.hex()}

@chal.route('/ecbcbcwtf/encrypt_flag/')
def encrypt_flag():
    iv = os.urandom(16)
    cipher = AES.new(KEY, AES.MODE_CBC, iv)
    encrypted = cipher.encrypt(FLAG.encode())
    ciphertext = iv.hex() + encrypted.hex()
    return {"ciphertext": ciphertext}

可以看出,flag是以AES-CBC 加密, 之後提供了一個用AES-ECB解密的副函式
經過昨天的了解,對於ECB應該有一點點小了解了,對吧w
所以我們就來看encrypt_flag()就好惹

  • encrypt_flag code:
def encrypt_flag():
    iv = os.urandom(16)
    cipher = AES.new(KEY, AES.MODE_CBC, iv)
    encrypted = cipher.encrypt(FLAG.encode())
    ciphertext = iv.hex() + encrypted.hex()
    return {"ciphertext": ciphertext}

程式碼解釋大概是
當我們按下右邊那個按鈕後

https://ithelp.ithome.com.tw/upload/images/20231004/20162613fRByHnULDS.png

會先生成一個初始向量 iv
之後經過AES_CBC加密,最後輸出iv.hex() + encrypted.hex()

所以假設我們最後拿到{"ciphertext": "756d3a3a2fd4dfbe30400cdef7564c7123eaacb9abeb2e31efca20b7430671a26467e2c998a213b6f88a345fb18a4128"}
那麼就可以拆成

iv = "756d3a3a2fd4dfbe30400cdef7564c71"
ciphertext1 = "23eaacb9abeb2e31efca20b7430671a2"
ciphertext2 = "6467e2c998a213b6f88a345fb18a4128"

有這,就可以來解題拉

噢等等,先了解CBC在幹嘛後再解題好惹

在此以CBC的加密為例
https://ithelp.ithome.com.tw/upload/images/20231005/20162613z8wLUjLZGj.png

然後我把加密後命名為plaintext""_xor
https://ithelp.ithome.com.tw/upload/images/20231005/20162613KdVohCyGyw.png

  • CBC加密流程
    一樣會先把plaintext切成一個個block

在此切為plaintext1、plaintext2、plaintext3
之後會生成一個初始向量iv

  • 第一組
    把plaintext1跟iv做xor,之後進行加密,得到ciphertext1
  • 第二組
    plaintext2跟plaintext1_xor,做xor,之後進行加密,得到ciphertext2
  • 第三組
    plaintext3跟plaintext2_xor,做xor,之後進行加密,得到ciphertext3

每個明文塊先與前一個密文塊進行互斥或後,再進行加密

解法

這題其實不難,看懂這兩張圖就ok了!

  • ECB_decrypt
    https://ithelp.ithome.com.tw/upload/images/20231004/20162613Kvy5b5ltSO.png
  • CBC_decrypt
    https://ithelp.ithome.com.tw/upload/images/20231004/201626132BkWNrrKpZ.png

在這題可以觀察出

  • 加解密用的key是相同的,就長一樣
  • ECB 跟 CBC 差別只有CBC多了一個xor的動作
  • encrypt_flag 的output可以拆解為
    iv + ciphertext1 + ciphertext2

ciphertext = iv.hex() + encrypted.hex()
return {"ciphertext": ciphertext}

  • 核心觀念
    https://ithelp.ithome.com.tw/upload/images/20231004/20162613jRwVxsoU4T.png
    可以發現,圈起來的地方是相同的,所以我們可以透過ECB解密,之後把解密後得到的字串去跟iv xor 就可以獲得第一個plaintext
    我們可以得到以下流程

ciphertext1丟到ECB_decrypt之後xor iv = plaintext1
ciphertext2丟到ECB_decrypt之後xor ciphertext1 = plaintext2
plaintext1 + plaintext2 = flag

  • code
    ciphertext1_ECB我是手動把ciphertext1丟到它網站上的decrypt,ciphertext2_ECB同理
from pwn import * 
ciphertext = "756d3a3a2fd4dfbe30400cdef7564c7123eaacb9abeb2e31efca20b7430671a26467e2c998a213b6f88a345fb18a4128"

iv =          "756d3a3a2fd4dfbe30400cdef7564c71"
ciphertext1 = "23eaacb9abeb2e31efca20b7430671a2"
ciphertext2 = "6467e2c998a213b6f88a345fb18a4128"

ciphertext1_ECB = "161f434a5bbba48d532253eb82352744"
ciphertext2_ECB = "7cdeda899a8f7100d8950196622750df"


plaintext1 = xor(bytes.fromhex(iv), bytes.fromhex(ciphertext1_ECB))
plaintext2 = xor(bytes.fromhex(ciphertext1), bytes.fromhex(ciphertext2_ECB))

print((plaintext1 + plaintext2).decode())
  • output
    https://ithelp.ithome.com.tw/upload/images/20231004/20162613UBfRav20Q0.png

flag : crypto{3cb_5uck5_4v01d_17_!!!!!}

小結

今天了解了CBC的流程,跟複習了一下昨天學的ECB,明天繼續下一題!


上一篇
【Day 23】Symmetric CryptoGraphy05 - ECB
下一篇
【Day 25】Symmetric CryptoGraphy07 - Flipping Cookie
系列文
資安小白的密碼學從0到1-CryptoHack平台解題紀錄31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言