so = Solver() flag = [BitVec(f'flag{i}',8) for i inrange(36)] a = [i for i in flag] b = [i for i inrange(36)] c = [0for i inrange(36)] d = [0x12027,0x0F296,0x0BF0E,0x0D84C,0x91D8,0x297,0x0F296,0x0D830,0x0A326,0x0B010,0x7627,0x230,0x0BF0E,0x0A326,0x8FEB,0x879D,0x70C3,0x1BD,0x0D84C,0x0B010,0x879D,0x0B00D,0x6E4F,0x1F7,0x91D8,0x7627,0x70C3,0x6E4F,0x9BDC,0x15C,0x297,0x230,0x1BD,0x1F7,0x15C,0x6] for i inrange(6): for j inrange(6): b[i+6*j] = a[6*i+j] for i inrange(6): for j inrange(6): for k inrange(6): c[j+6*i] = c[j+6*i] + a[6*i+k]*b[6*k+j] so.add(simplify(c[j+6*i]) == d[j+6*i]) for i inrange(6,36-10): so.add(flag[i]>=32) so.add(flag[i]<=127) for i inrange(6): so.add(flag[i] == ord('whctf{'[i])) for i inrange(36-9,36): so.add(flag[i] == 0x1) so.add(flag[-10] == ord('}')) if so.check() == sat: m = so.model() print(''.join(chr(m[i].as_long()) for i in flag)) else: print('Error')