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