1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
| from z3 import*
apple = 1 banana = 1 cherry = 1
s = Solver() data = [0x00000010, 0x00000000, 0x00000008, 0x00000014, 0x0000000E, 0x0000000C, 0x00000012, 0x00000002, 0x00000016, 0x0000000A, 0x00000006, 0x00000004]
flag = [BitVec('%d' % i,32)for i in range(24)]
for i in range(24): s.add(flag[i] <127) s.add(flag[i] >=32)
def calc_1(x): return ((x << 4) | (x >> 4))
def calc_2(x, y): return ((x ^ y) & 0xff)
def calc_3(x, y): return ((x & 0x55) | ((y & 0xaa) >> 1))
def calc_4(x, y): return (((x * y) % 1257) & 0xff)
def calc_5(x): return ((x << 1) | (x >> 7))
def calc_6(x): return ((x << 3) ^ (x >> 5))
def calc_7(x, y): return ((x << 4) ^ y)
def func_1(a, b, c, d): return calc_1(calc_4(calc_5(calc_1(calc_3(calc_5(calc_2(a,b)),calc_5(calc_2(c,d))))),b))
def func_2(a, b): return calc_5(calc_1(calc_2(a,b)))
def func_3(a, b): return calc_7(b,calc_1(calc_2(a,b)))
def func_4(a, b): return (a ^ b)
def check_a(a,b): global apple s.add(calc_4(calc_5(calc_1(a)),apple) == b) apple += 1
def check_b(a,b): global banana s.add(calc_5(calc_1(a)) == b) banana += 1
def check_c(a,b): global cherry s.add(calc_6(a) == b) cherry += 1 if __name__ == '__main__': input_len = 24 array_1st = [0] * 6 array_2nd = [0] * 6 array_3rd = [0] * 12 for i in range(0, input_len, 4): if i < 12: array_3rd[data[i + 3] // 2] = func_2(flag[data[i + 3]], flag[data[i + 3] + 1]) array_1st[i // 4] = func_4(func_3(flag[i * 2], flag[i * 2 + 2]), func_3(flag[i * 2 + 4], flag[i * 2 + 6])) if i < 4: array_2nd[i // 4] = func_1(flag[i], flag[i + 4], flag[i + 8], flag[i + 12]) array_1st[(i // 4) + 3] = func_4(func_3(flag[i * 2 + 1], flag[i * 2 + 3]), func_3(flag[i * 2 +5], flag[i *2+7])) array_3rd[data[i+1]//2]=func_2(flag[data[i+1]],flag[data[i+1]+1]) array_3rd[data[i+2]//2]=func_2(flag[data[i+2]],flag[data[i+2]+1]) if i==4: array_2nd[1]=func_1(flag[16],flag[20],flag[1],flag[5]) array_3rd[data[i]//2]=func_2(flag[data[i]],flag[data[i]+1]) else: if i<16: array_2nd[i//6]=func_1(flag[i-3],flag[i+1],flag[i+5],flag[i*2-3]) array_2nd[3]=func_1(flag[2],flag[6],flag[10],flag[14]) check_c(array_1st[0],0x202) check_c(array_1st[1],0x1aa2) check_c(array_1st[2],0x5a5)
array_2nd[4]=func_1(flag[cherry*2-apple-banana],flag[cherry*2+apple+banana],flag[apple*3],flag[banana*7]) array_2nd[5]=func_1(flag[cherry+apple],flag[cherry+5],flag[cherry*2-banana],flag[cherry*2+3]) check_a(array_2nd[0],0x5B) check_a(array_2nd[1],0xD) check_a(array_2nd[2],0x5D) check_a(array_2nd[3],0XA4) check_a(array_2nd[4],0X34) check_a(array_2nd[5],0xDC)
check_b(array_3rd[0],0x1010) check_b(array_3rd[1],0x2828) check_b(array_3rd[2],0x3838) check_b(array_3rd[3],0x7070) check_b(array_3rd[4],0x12d2d) check_b(array_3rd[5],0x10d0d) check_b(array_3rd[6],0x4444) check_b(array_3rd[7],0x1414) check_b(array_3rd[8],0xc4c4) check_b(array_3rd[9],0xDCDC) check_b(array_3rd[10],0x16161) check_b(array_3rd[11],0x17171) check_b(func_2(flag[20],flag[23]),0x1010) check_b(func_2(flag[14],flag[0]),0x16161) check_c(array_1st[3],0x70F) check_c(array_1st[4],0x3787) check_c(array_1st[5],0x3111)
check = 0 for i in range(input_len): check = (check * 251) ^ flag[i] s.add(apple == 7) s.add(banana == 15) s.add(cherry == 13) s.add(check == 0x4E6F76D0)
print(s.check())
if(s.check() == sat): fin = s.model() print(''.join([chr(fin[x].as_long()) for x in flag])) else: print("no ans")
|