SHA2017CTF Writeup

目錄

  1. Crypto 100: Stack Overflow
  2. Crypto 200: Secure Login
  3. Forensics 100: WannaFly


Crypto 100: Stack Overflow

0x00. 背景

題目提供了代碼跟一個使用該代碼加密的 pdf 檔:

0x01. 思路與題解

要知道發生甚麼錯誤,先看以下代碼:

輸出如下:

大家可以見到 68390392f04509f8f47832a83533c347 一直在重複,為什麼?

問題出處是  counter=lambda: secret

在 PyCrypto 裡,CTR mode 的 counter 是一個函數:它有 0 個 input,1 個 output。題目提供的 counter 函數符合這個條件,但是它的輸出永遠是一樣的。

意味著 Nonce + Counter 那一段是永遠不變的!既然相同的 “Message” (Nonce + Counter) 被相同的 Key 用相同的系統加密,它得出的東西自然是相同的。

所以,現在加密系統就變了一個 16-byte key XOR cipher。

既然知道是這樣,我們可以用 PDF header 等等資訊來得到 XOR cipher 的 key,繼而得到 plaintext。

延伸問題:如果我「死都要用」CTR mode,應該怎樣做?

你可以用 counter = Crypto.Util.Counter.new(64, nonce) 定義 counter。

以下是測試代碼:

輸出:


Crypto 200: Secure Login

0x00. 背景

題目提供了一個用 RSA 作加密的系統。

你的目的是找出一個 signature (\(s\)),使得本來的訊息 \(m \equiv s^d (\text{mod } n)\) 以  ticket:admin|root| 起首。

0x01. 思路與題解

它提供了兩個 signing 的功能,一個 [1] 是把  ticket:user|*|* 簽署,另一個 [3] 是把你的訊息前面加了一個 \xff  後簽署。

然而我們想要的是  ticket:admin|root|*,可以怎樣做呢?

發現到 [1] 有一個 implementation problem:他沒有檢查信息的總長度。

所以我們可以這樣做:找出一個 payload 使得 ticket:user|user|payload (這是一個很長的訊息) 除以 \(n\) 的餘數是  ticket:admin|root|lol

寫了一段代碼解決,得到 flag:  flag{8f898e19de410591acbcdbfae798d603}


Forensics 100: WannaFly

0x00. 背景

My daughter Kimberly her computer got hacked. Now she lost all her favorite images. Can you please help me recover those images?

利申:這題比賽的時候不是我做的,我只是覺得好玩才寫 write-up。

題目給定了 kimberly.img,用  sudo mount kimberly.img /mnt 之後  ls -alR

發現有一堆圖片,以下是其中一張:

0x01. 思路與題解

圖片被加密了。去看看 .bash_history,發現以下記錄:

打開 ... 這個檔案,發現是個 Python script:

簡單一點:它把所有 .png 檔加密,並把加密的內容加到已被模糊的原圖上。如果用 text editor 把圖片打開,你會發現最後是一堆 Base64 encoding。

它使用 AES-CFB 加密,key 是唯一一個 input argument,而 IV 是用 get_iv() 生成出來的。

  1. Key 可以在 .bash_history  看到: Hb8jnSKzaNQr5f7p 。
  2. 可以看到檔案最後於 2017-06-21 00:14 更新,所以 seed 只可以是 60 個其中一個數字。

寫了一段 script 解密,得到 flag:  flag{ed70550afe72e2a8fed444c5850d6f9b} 


發表迴響