題目資訊
Category: Crypto + Reverse
Point: 100
Description:
For reasons unknown an amature cryptographer wrote an application to generate “strong encryption keys”. One of these keys was used to encrypt a tar archive with the flag. They used openssl command line util with -aes-128-cbc. Could you please get the flag? It shouldn’t take much time…
flag.zip.enc
keypassHints
$ opensslOpenSSL> versionOpenSSL 1.1.0e 16 Feb 2017
解法
先是把keypass丟進IDA pro看看,看起來要解析似乎有點麻煩,之後就直接跑keypass看看了。
|
|
看來程式是會吃一個argument當pass_phrase,之後把pass_phrase轉變成要丟進openssl的passphrase。
稍微測測看幾個pass_phrase:
歸納一下:
咦!看起來似乎是把字串內的所有字做了xor運算,再根據運算結果輸出一個passphrase,再來驗證一下:
驗證成功!所以只要跑keypass(chr(0)) ~ keypass(chr(255))
,就可以窮舉出所有的key了!
先建個passphrase_list出來:
再來寫個python script把每個passphrase都拿去解密看看:
找到正確的passphrase是\M)R<.DDe/:;d>JZP
,得到flag.zip
。下unzip flag.zip
,得到flag.txt
。
Flag: VolgaCTF{L0ve_a11_trust_@_few_d0_not_reinvent_the_wh33l}
大坑
官方後來才給了Hints,說明是用最新版OpenSSL 1.1.0e
做加密的,但目前的套件管理工具都是存OpenSSL 1.0.2b
版本,要裝要自己拿source來編,結果一怒之下就找了個 online unix terminal (TutorialsPoint) 來用了,載source編譯在local安裝,最後跑解密成功。
一開始嘗試了舊版沒辦法解密,原因出在舊版用passphrase去產生key時的implementation中default是用了md5做hash,而新版的則是用sha256。
詳情可以看這個openssl github的commit:
https://github.com/openssl/openssl/commit/f8547f62c212837dbf44fb7e2755e5774a59a57b
後來在stackoverflow找到了這篇:
Encryption/decryption doesn’t work well between two different openssl versions
再看一下openssl -md的說明:
因此如果要用舊版解密要加上-md sha256
,嘗試一下:
解密成功!