iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0

前言

昨天稍微認識了現代密碼學的概念,今天就來打題目~
這次使用選的題目是 Hackme CTFeasy AES,難度應該算是蠻剛好的,如果想自己挑戰看看的讀者就先不要往下看~~

Write-up

easy AES

題目會給一段 Python code,大致如下:

def main(data):
    c = AES.new(b'Hello, World...!')
    plain_text = bytes.fromhex(input('What is your plain text? '))
    if c.encrypt(plain_text) != b'Good Plain Text!':
        print('Bad plain text')
        exit()

    c2 = AES.new(plain_text[::-1], mode=AES.MODE_CBC, IV=b'1234567887654321')

    decrypted = c2.decrypt(data)

    with open('output.jpg', 'wb') as fout:
        fout.write(decrypted)

這題會用到 pycrypto 這個 package,不過這個專案已經沒有維護了,如果要解這題的話用 3.9 以前的 Python 版本會比較方便,3.10 以後的版本會報錯。

這個程式有 cc2 兩個 cipher,第一個 cipher 是用 "Hello, World...!" 當 key,加密後的明文如果等於 "Good Plain Text!" 才會跑到下半部分。
下半部分解密出來的資料會被寫到一張 jpg 圖檔中,這就是我們的目標了。

依照這段邏輯,我們需要知道什麼明文使用 c 加密完之後會等於 "Good Plain Text!",但我們也不需要自己算。

大家應該還記得 AES 是對稱式加密的演算法,也就是加密與解密都是同一把 key,那我們其實只要用 c 來解密 "Good Plain Text!" 就可以得到得到我們需要的明文,修改程式如下:

def main(data):
    c = AES.new(b'Hello, World...!')
    plain_text = c.decrypt(b"Good Plain Text!")
    if c.encrypt(plain_text) != b'Good Plain Text!':
        print('Bad plain text')
        exit()
	...

執行後即可在圖片中找到 flag!

後記

希望明天可以順利找到難度適中的非對稱式加密的題目,不然我只好寫別的主題了 XD


上一篇
Day 16. Crypto - 雜湊與現代密碼學
下一篇
Day 18. Crypto - 非對稱式加密 實戰
系列文
進了資安公司當後端 RD 才入門資安會不會太晚了30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言