👋

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