VolgaCTF 2020 writeup

VolgaCTF2020に参加しました

CTFへのやる気が最近出てきてて、その勉強の一環としてこのコンテストに参加しました。d4wnin9が一緒にでてくれました。ありがたい。

チーム名はbodhiです。これからも頑張りたいと思います。

解いた問題

cryptoの一問だけなんで書こうか悩みましたが、あとあと自分の役にも立ちそうなので書こうと思います。

解いたのはNoname[100]これ絶対100いらん。他の50の問題とかより簡単だった。なんならこれが一番簡単かも。

Noname[crypto,100]

[問題文]I have Noname; I am but two days old.

pythonのファイルと暗号化されたflagが渡されます。

[encryptor.py]

from Crypto.Cipher import AES
from secret import flag
import time
from hashlib import md5

key = md5(str(int(time.time()))).digest()
padding = 16 - len(flag) % 16
aes = AES.new(key, AES.MODE_ECB)
outData = aes.encrypt(flag + padding * hex(padding)[2:].decode('hex'))
print(outData.encode('base64'))

 [encrypted] 

uzF9t5fs3BC5MfPGe346gXrDmTIGGAIXJS88m
ZntUWoMn5fKYCxcVLmNjqwwHc2sCO3eFGGXY
3cswMnO7OZXOw==

 

pyhonの内容でわかること

・time.time()で出た値をmd5変換する ← これがAES暗号のkey

・AESでエンクリプションしたflagをさらにbase64エンコードする

ほかの行はあまり読まなくていいと思う

 

調べる

time.time()の値がどのようなものか知らなかったので調べてみる

調べた結果

1970年1月1日0時0分0秒から今までの時間を秒単位で表す 

 今何秒かわからなかったのでコードを書いて実行すると、1585358796(2020/3/29/10:35くらい)でした。keyで取り出した値はいつかわからないのである程度の範囲を作ることにした。  [1580000000,1585300000]

この範囲は結構適当な計算。しかも書いてて気づいたけどtwo days oldってことは2日前に作られたってことじゃね?

無駄なことをしてしまいました...

 

復号していく

書いたコードはこちら

from Crypto.Cipher import AES
from hashlib import md5
import base64



for i in range(1580000000,1585300000):
    key=md5(str(i)).digest()

    enc='uzF9t5fs3BC5MfPGe346gXrDmTIGGAIXJS88mZntUWoMn5fKYCxcVLmNjqwwHc2sCO3eFGGXY3cswMnO7OZXOw=='

    decipher=AES.new(key,AES.MODE_ECB)

    dec=decipher.decrypt(base64.b64decode(enc))
    print(dec)

・for文でさっき作った範囲を回す

・keyを自分で作って復号する

    実行する

   python decode.py | grep -a Volga
VolgaCTF{5om3tim3s_8rutf0rc3_i5_th3_345iest_w4y}

ちゃんと出てきました。grepするときに-aしていないとうまいこといかなかったです。

最後に

今回のコンテストは今までと全く違うくて楽しかった。

画像処理が全くわからなかったのでそれを次は勉強していきたい。

結構あともうちょっとっていう問題もあったので、writeup見て勉強していきたいと思います。

ありがとうございました。