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}