[Technofair Final 2022] – 3z chall

Pada soal ini, kami diberikan sebuah file pyc maka langsung saja kita gunakan tools decompiler bytecode yaitu Uncompyle6. Hasilnya adalah sebagai berikut:

Jika diperhatikan, kodingan tersebut memvalidasi username dengan cara membandingkan indexnya yang harus memenuhi persyaratan tertentu, sedangkan untuk password adalah S3cr3t_Pas5 yang urutannya diacak menggunakan random.shuffle dengan seed time.time(). Untuk menyelesaikan username kita bisa menggunakan modul python z3-solver dan untuk password kita tinggal menggunakan seed time.time() agar susunannya sesuai dengan yang dijalankan pada server.

Beginilah script python yang kami buat:

import random, binascii, time
from z3 import *
from pwn import *
import math

s = Solver()
username = [BitVec(f'{i}’, 8) for i in range(34)]
s.add(username[0] – 41 == 60)
s.add(username[1] – 54 == 59)
s.add(username[2] – 45 == 4)
s.add(username[3] – 46 == 40)
s.add(username[4] – 39 == 77)
s.add(username[5] ^ 31 == username[17])
s.add(username[6] ^ 99 == username[3])
s.add(107 ^ username[7] == 4)
s.add(75 + username[8] == 197)
s.add(89 + username[9] == 165)
s.add(username[10] – 53 == -1)
s.add(username[11] & 46 == 42)
s.add(username[12] ^ 67 == username[19])
s.add(114 ^ username[13] == 25)
s.add(86 + username[14] == 197)
s.add(username[15] ^ 97 == username[6])
s.add(103 ^ username[16] == 15)
s.add(76 + username[17] == 185)
s.add(96 + username[18] == 145)
s.add(username[19] – 31 == 82)
s.add(username[20] & 31 == 21)
s.add(username[21] & 31 == 18)
s.add(username[22] – 44 == 78)
s.add(username[23] – 56 == -5)
s.add(94 + username[24] == 211)
s.add(89 + username[25] == 171)
s.add(username[26] ^ 7 == username[23])
s.add(username[27] ^ 23 == username[33])
s.add(username[28] ^ 99 == username[3])
s.add(username[29] ^ 32 == username[33])
s.add(username[30] – 42 == 80)
s.add(username[31] & 58 == 50)
s.add(username[32] & 48 == 48)
s.add(username[33] ^ 64 == username[12])
s.add(63 + username[0] == 164)
s.add(username[1] ^ 67 == username[12])
s.add(username[2] – 33 == 16)
s.add(username[3] ^ 59 == username[17])
s.add(username[4] ^ 14 == username[8])
s.add(username[5] & 38 == 34)
s.add(username[6] ^ 6 == username[31])
s.add(username[7] – 52 == 59)
s.add(108 ^ username[8] == 22)
s.add(username[9] ^ 36 == username[16])
s.add(username[10] – 50 == 2)
s.add(username[11] ^ 91 == username[2])
s.add(username[12] & 36 == 32)
s.add(username[13] – 58 == 49)
s.add(111 ^ username[14] == 0)
s.add(username[15] – 52 == 32)
s.add(username[16] & 49 == 32)
s.add(92 + username[17] == 201)
s.add(79 + username[18] == 128)
s.add(106 ^ username[19] == 27)
s.add(username[20] – 31 == 86)
s.add(114 ^ username[21] == 32)
s.add(81 + username[22] == 203)
s.add(117 ^ username[23] == 70)
s.add(username[24] & 48 == 48)
s.add(127 ^ username[25] == 45)
s.add(108 ^ username[26] == 88)
s.add(106 ^ username[27] == 15)
s.add(username[28] – 31 == 22)
s.add(username[29] & 35 == 2)
s.add(username[30] ^ 14 == username[4])
s.add(86 + username[31] == 137)
s.add(username[32] ^ 4 == username[1])
s.add(75 + username[33] == 189)
     
# print(s.check())
# print(s.model())
if s.check() == sat:
    c = s.model()
    flagga = ”.join([chr(c[i].as_long()) for i in username])
# print(flagga)
# okay decompiling chall.pyc


if __name__ == ‘__main__’:
    while True:
r = remote(‘103.167.132.153’, 34310)
r.recvuntil(b’Username : ‘)
r.sendline(flagga.encode())
r.recvuntil(b’Password : ‘)
random.seed(math.floor(time.time())+1)
server_pass = list(‘S3cr3t_Pas5’)
random.shuffle(server_pass)
r.sendline(”.join(server_pass).encode())
hasil = r.recvline()
if b’Techno’ in hasil:
print(hasil)
break

Note: di sini time.time() nya kami tambahkan satu karena kita melihat perbedaannya ketika menjalankan kodingan tersebut di local dan biar lebih pasti kami gunakan while.

Output:

Flag = TechnoFairCTF{ez3_equation_ch4ll}

Leave a Reply

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