C3¶
اومدیم با چالش نسبتا ساده ی کریپتوگرافی! picoCTF که فلگ رو پیدا کنیم.
فایل ciphertext شامل موارد زیر است:
└─$ cat ciphertext
DLSeGAGDgBNJDQJDCFSFnRBIDjgHoDFCFtHDgJpiHtGDmMAQFnRBJKkBAsTMrsPSDDnEFCFtIbEDtDCIbFCFtHTJDKerFldbFObFCFtLBFkBAAAPFnRBJGEkerFlcPgKkImHnIlATJDKbTbFOkdNnsgbnJRMFnRBNAFkBAAAbrcbTKAkOgFpOgFpOpkBAAAAAAAiClFGIPFnRBaKliCgClFGtIBAAAAAAAOgGEkImHnIl
و کد منبع پایتون (با افزودن خطوط شکسته برای خوانایی) به این شکل است:
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)
از کد میفهمیم که رمزنگاری ترکیبی از دو جدول جستجوی چرخشی با طول ۴۰ است. برای رمزگشایی، باید عملیات را به ترتیب معکوس انجام دهیم.
ابتدا یک اسکریپت رمزگشایی اولیه میسازیم:
import sys
ciphertext = 'DLSeGAGDgBNJDQJDCFSFnRBIDjgHoDFCFtHDgJpiHtGDmMAQFnRBJKkBAsTMrsPSDDnEFCFtIbEDtDCIbFCFtHTJDKerFldbFObFCFtLBFkBAAAPFnRBJGEkerFlcPgKkImHnIlATJDKbTbFOkdNnsgbnJRMFnRBNAFkBAAAbrcbTKAkOgFpOgFpOpkBAAAAAAAiClFGIPFnRBaKliCgClFGtIBAAAAAAAOgGEkImHnIl'
lookup1 = "\n \"#()*+/1:=[]abcdefghijklmnopqrstuvwxyz"
lookup2 = "ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst"
out = ""
prev = 0
for char in ciphertext:
index_2 = lookup2.index(char)
index_1 = (index_2 + prev) % 40
out += lookup1[index_1]
prev = index_1
sys.stdout.write(out)
با اجرای اسکریپت، خروجی زیر را دریافت میکنیم:
└─$ python decode.py
#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
مشاهدات:
اسکریپت از خودش بهعنوان ورودی استفاده میکند (خط سوم کامنت ها). نسخه پایتون مورد انتظار 2 است (خط چهارم کامنت ها). این خروجی را بهعنوان stage2.py ذخیره میکنیم:
python decode.py > stage2.py
در نهایت، اسکریپت stage2.py را اجرا میکنیم و خودش را بهعنوان ورودی به آن میدهیم. سپس خطوط جدید را با tr -d حذف کرده و خروجی را به printf میدهیم تا پرچم نهایی را بسازد:
printf "picoCTF{%s}" $(python2 ./stage2.py < stage2.py | tr -d '\n')
و فلگ پیدا شد !
FLAG 
picoCTF{adlibs}نویسنده