[Qual Find-IT CTF] – Solvable Random

Codingan soal:

import random,string

decode_this = “MmypTSPBJ{q6k_e1s_q1Ld8I}”
flag = “{Must be EZ}”
enc_flag = “”
random.seed(“FINDIT”)
for c in flag:
  if c.islower():
      enc_flag += chr((ord(c)-ord(‘a’)+random.randrange(0,26))%26 + ord(‘a’))
  elif c.isupper():
      enc_flag += chr((ord(c)-ord(‘A’)+random.randrange(0,26))%26 + ord(‘A’))
  elif c.isdigit():
      enc_flag += chr((ord(c)-ord(‘0’)+random.randrange(0,10))%10 + ord(‘0’))
  else:
      enc_flag += c
print(“Randomize Flag: “+ enc_flag)

Diberikan sebuah codingan enkripsi dengan hasil enkripsi MmypTSPBJ{q6k_e1s_q1Ld8I}.Si pembuat soal juga sudah memberikan seed yang dipakai untuk fungsi random, yaitu “FINDIT” sehingga kita tinggal memanfaatkannya dengan me-reverse operasi-operasinya dari kodingan yang sudah ada.

import random,string

decode_this = “MmypTSPBJ{q6k_e1s_q1Ld8I}”
dec_flag = “”
random.seed(“FINDIT”)
for c in decode_this:
    if c.islower():
        obj = (ord(c) – 97) – random.randrange(0, 26) + 97
        dec_flag+=chr(obj)
    elif c.isupper():
        obj = (ord(c) – 97) – random.randrange(0, 26) + 97
        dec_flag+=chr(obj)
    elif c.isdigit():
        obj = (ord(c) – 48) – random.randrange(0, 10) + 48
        dec_flag+=chr(obj)
    else:
        dec_flag += c
print(“Flag: “+ dec_flag)

Output = FindI:C:F{n0Z_Z0o_X*4d03}

Sudah mulai terbentuk, namun masih banyak karakter yang kelihatan tidak sesuai dengan flag seharusnya. Ini disebabkan karena operator % (modulo) pada soal, sehingga bisa jadi nilai aslinya lebih tinggi, namun dikecilkan karena modulo. Untuk itu, tinggal menambahkan sedikit perintah kondisi, di mana jika hasil operasi masih kurang dari nilai ascii alphabet/angka, dia akan ditambahkan nilai lebih (26 untuk alfabet, 10 untuk angka). Sehingga menjadi:

import random, string

decode_this = “MmypTSPBJ{q6k_e1s_q1Ld8I}”
dec_flag = “”
random.seed(“FINDIT”)
for c in decode_this:
      if c.islower():
        obj = (ord(c) – 97) – random.randrange(0, 26) + 97
        if obj < 97:
            obj +=26
        dec_flag+=chr(obj)
      elif c.isupper():
        obj = (ord(c) – 97) – random.randrange(0, 26) + 97
        if obj < 65:
            obj +=26
        dec_flag+=chr(obj)
      elif c.isdigit():
        obj = (ord(c) – 48) – random.randrange(0, 10) + 48
        if obj < 48:
            obj +=10
        dec_flag+=chr(obj)
      else:
        dec_flag += c
print(“Flag: “+ dec_flag)

Flag: FindITCTF{n0t_t0o_r4Nd0M}

Leave a Reply

Your email address will not be published. Required fields are marked *