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
| from z3 import * DataCmp=[ 0x66,0x4E,0XA9,0XFD,0X3C,0X55,0X90,0X24, 0X57,0XF6,0X5D,0XB1,0X01,0X20,0X81,0XFD, 0X36,0XA9,0X1F,0XA1,0X0E,0X0D,0X80,0X8F, 0XCE,0X77, 0XE8,0X23,0X9E,0X27,0X60,0X2F,0XA5,0XCF, 0X1B,0XBD,0X32,0XDB,0XFF,0X28,0XA4,0X5D] flag = [BitVec('flag[%2d]' % i, 8) for i in range(42)] out=[0]*42 for i in range(42): out[i]=flag[i] v11 = 0 v10 = 0 i = 0 j = 0 v9 = 0 v1 =0 f = Solver() for i in range(7): for j in range(6): v9=6*i+j v11=flag[v9] v10=flag[v9] v11 = ~v11 v11 &= i * (j + 2) v10 = v10 & ~(i * (j + 2)) | v11 v9 = 7 * j + i out[v9] = v10 for i in range(41): if (i+1)%2==1: out[i+1]*=107 else: out[i+1]+=out[i] for i in range(42): f.add(out[i]==DataCmp[i]) while(f.check()==sat): condition = [] m = f.model() p="" for i in range(42): p+=chr(int("%s" % (m[flag[i]]))) condition.append(flag[i]!=int("%s" % (m[flag[i]]))) print(p) f.add(Or(condition))
|