こんとろーるしーこんとろーるぶい

週末にカチャカチャッターン!したことを貼り付けていくブログ

SECCON Beginners CTF 2018 - Message from the future

問題文

2020年からメッセージが届きました。
0f242e412b34212e3d65501c2d7e597f47395c0751675a2b13567d5f3c7b6a1d70540a684d604759
メッセージはこのプログラムによって暗号化されています。
添付ファイル:Message_from_the_future_66d0d873b93941f6273326c1ee6c4686dbfca4f5.zip

writeup

添付ファイルを展開すると実行ファイルが1つ。

root@kali:Message from the future# file Message_from_the_future 
Message_from_the_future: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped

実行してみる。

root@kali:Message from the future# ./Message_from_the_future
[-] Invalid arguments.

root@kali:Message from the future# ./Message_from_the_future A
6f

root@kali:Message from the future# ./Message_from_the_future AA
6f78

root@kali:Message from the future# ./Message_from_the_future AAA
6f7830

root@kali:Message from the future# ./Message_from_the_future AAAA
6f78303d

root@kali:Message from the future# ./Message_from_the_future AAAAA
6f78303d17

root@kali:Message from the future# ./Message_from_the_future AAAAAA
6f78303d171b

入力した文字列を1文字ずつ暗号化しているようだ。
よって、1文字ずつブルートフォースして、0f242e412b34212e3d65501c2d7e597f47395c0751675a2b13567d5f3c7b6a1d70540a684d604759になる入力文字列を特定できそうだ。

なお、stringsとobjdumpにかけるが、結果がいまいち。
パックされているのだろうか。

ブルートフォースするスクリプトは以下。

import subprocess

encrypted = "0f242e412b34212e3d65501c2d7e597f47395c0751675a2b13567d5f3c7b6a1d70540a684d604759"
flag = ""

while True:
    for e in range(1,255):
        r = subprocess.check_output(["./Message_from_the_future", "{}{}".format(flag, chr(e))])
        if encrypted.startswith(r.decode("utf-8").strip()):
            flag += chr(e)
            print("flag=" + flag)
            break

実行する。

root@kali:Message from the future# python try.py 
flag=!
flag=!
flag=!_
flag=!_=
flag=!_=}
flag=!_=}n
flag=!_=}nb
flag=!_=}nbN
flag=!_=}nbNR
flag=!_=}nbNRG
flag=!_=}nbNRG[
flag=!_=}nbNRG[d
flag=!_=}nbNRG[d!
flag=!_=}nbNRG[d!]
flag=!_=}nbNRG[d!]2
flag=!_=}nbNRG[d!]2
flag=!_=}nbNRG[d!]2{

あれ、うまくいかない。

しばらく手詰りになるが、問題文を見返す。

2020年からメッセージが届きました。

引数以外の要素として、「時間」を使っていると推測する。

システム日時を2020年に変更して実行する。

root@kali:Message from the future# ./Message_from_the_future AAAA
6f78303d
root@kali:Message from the future# date -s "01/01 13:00 2020"
2020年  1月  1日 水曜日 13:00:00 JST
root@kali:Message from the future# ./Message_from_the_future AAAA
48566329

結果が変わった。ビンゴ。
なお、自動時刻同期を切っておく必要があるので注意。

いくつか試すと、年または月を変えると結果が変わり、日付と時間は影響がないようだ。
2020年の1月から順々に試すと、2020年8月で成功した。

root@kali:Message from the future# date -s "08/01 13:00 2020"
2020年  8月  1日 土曜日 13:00:00 JST

root@kali:Message from the future# python try.py 
flag=c
flag=ct
flag=ctf
flag=ctf4
flag=ctf4b
flag=ctf4b{
flag=ctf4b{4
flag=ctf4b{4r
flag=ctf4b{4r3
flag=ctf4b{4r3_
flag=ctf4b{4r3_y
flag=ctf4b{4r3_y0
flag=ctf4b{4r3_y0u
flag=ctf4b{4r3_y0u_
flag=ctf4b{4r3_y0u_l
flag=ctf4b{4r3_y0u_l0
flag=ctf4b{4r3_y0u_l00
flag=ctf4b{4r3_y0u_l00k
flag=ctf4b{4r3_y0u_l00k1
flag=ctf4b{4r3_y0u_l00k1n
flag=ctf4b{4r3_y0u_l00k1n6
flag=ctf4b{4r3_y0u_l00k1n6_
flag=ctf4b{4r3_y0u_l00k1n6_f
flag=ctf4b{4r3_y0u_l00k1n6_f0
flag=ctf4b{4r3_y0u_l00k1n6_f0r
flag=ctf4b{4r3_y0u_l00k1n6_f0rw
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4r
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4rd
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4rd_
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4rd_7
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_20
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_202
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_?
flag=ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_?}

フラグゲット。
ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_?}