پرش به محتویات

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}


نویسنده

sw33tw3as3l