👋
picoCTF-writeup C3
問題
convert.py
import sys
chars = ""
from fileinput import input
for line in input():
chars += line
lookup1 = "\n \"#()*+/1:=[]abcdefghijklmnopqrstuvwxyz"
lookup2 = "ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst"
out = ""
prev = 0
for char in chars:
cur = lookup1.index(char)
out += lookup2[(cur - prev) % 40]
prev = cur
sys.stdout.write(out)
ciphertext
DLSeGAGDgBNJDQJDCFSFnRBIDjgHoDFCFtHDgJpiHtGDmMAQFnRBJKkBAsTMrsPSDDnEFCFtIbEDtDCIbFCFtHTJDKerFldbFObFCFtLBFkBAAAPFnRBJGEkerFlcPgKkImHnIlATJDKbTbFOkdNnsgbnJRMFnRBNAFkBAAAbrcbTKAkOgFpOgFpOpkBAAAAAAAiClFGIPFnRBaKliCgClFGtIBAAAAAAAOgGEkImHnIl
解説
暗号文と暗号化アルゴリズムが与えられている。
convert.pyでは平文のlookup1中のインデックスから前の文字のインデックスを引いた値を計算し、それをlookup2のインデックスとして変換している。
そのため逆算し復号する。
import sys
chars = "DLSeGAGDgBNJDQJDCFSFnRBIDjgHoDFCFtHDgJpiHtGDmMAQFnRBJKkBAsTMrsPSDDnEFCFtIbEDtDCIbFCFtHTJDKerFldbFObFCFtLBFkBAAAPFnRBJGEkerFlcPgKkImHnIlATJDKbTbFOkdNnsgbnJRMFnRBNAFkBAAAbrcbTKAkOgFpOgFpOpkBAAAAAAAiClFGIPFnRBaKliCgClFGtIBAAAAAAAOgGEkImHnIl"
lookup1 = "\n \"#()*+/1:=[]abcdefghijklmnopqrstuvwxyz"
lookup2 = "ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst"
result = ""
prev = 0
for char in chars:
cur_prev = lookup2.index(char)
cur = cur_prev + prev
result += lookup1[cur % 40]
prev = cur
print(result)
上記のコードで復号すると、スクリプトが出力された。
#asciiorder
#fortychars
#selfinput
#pythontwo
chars = ""
from fileinput import input
for line in input():
chars += line
b = 1 / 1
for i in range(len(chars)):
if i == b * b * b:
print chars[i] #prints
b += 1 / 1
これを実行する。inputを求められるのでciphertextを入力する。
L
g
H
D
P
t
改行を除いてFLAGの形式に当てはめる。
picoCTF{LgHDPt}
これで回答するが不正解。
スクリプトにスクリプト自体を与えて実行する。
a
d
l
i
b
s
これをFLAGの形式に直す。
picoCTF{adlibs}
これが正解であった。
Discussion