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_?}