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
| from z3 import* v8=[ 0x22,0x3f,0x34,0x32,0x72,0x33,0x18,0xa7, 0x31,0xf1,0x28,0x84,0xc1,0x1e,0x7a,0x00] v7=[ 0x01,0x04,0x07,0x0a,0x0d,0x10,0x12,0x14, 0x17,0x1a,0x1d,0x1f,0x21,0x24,0x27, 0x2a,0x2d,0x2f,0x31,0x34,0x37,0x3a,0x3d, 0x40,0x43,0x46,0x49,0x4c,0x4f,0x52,0x00, 0x00,0x22,0x3f,0x34,0x32,0x72,0x33,0x18, 0xa7,0x31] v5=[ 0x0A,0x04,0x10,0x08, 0x03,0x05,0x01,0x04, 0x20,0x08,0x05,0x03, 0x01,0x03,0x02,0x08, 0x0B,0x01,0x0C,0x08, 0x04,0x04,0x01,0x05, 0x03,0x08,0x03,0x21, 0x01,0x0B,0x08,0x0B, 0x01,0x04,0x09,0x08, 0x03,0x20,0x01,0x02, 0x51,0x08,0x04,0x24, 0x01,0x0C,0x08,0x0B, 0x01,0x05,0x02,0x08, 0x02,0x25,0x01,0x02, 0x36,0x08,0x04,0x41, 0x01,0x02,0x20,0x08, 0x05,0x01,0x01,0x05, 0x03,0x08,0x02,0x25, 0x01,0x04,0x09,0x08, 0x03,0x20,0x01,0x02, 0x41,0x08,0x0C,0x01 ] flag = [BitVec('flag[%2d]' % i, 8) for i in range(15)] out=[0]*15 for i in range(15): out[i]=flag[i] i=0 j=0 v11=0 v10=0 v9=0 for i in range(15): for j in range(2): v10=v7[v11+j] match v5[v10]: case 2: out[i]=out[i]+v5[v10+1] case 3: out[i]=out[i]-v5[v10+1] case 4: out[i]=out[i]^v5[v10+1] case 5: out[i]=out[i]*v5[v10+1] case 11: out[i]-=1 case 12: out[i]+=1 case _: continue v11+=2 f=Solver() for i in range(15): f.add(out[i]==v8[i]) while(f.check()==sat): condition = [] m = f.model() p="" for i in range(15): p+=chr(int("%s" % (m[flag[i]]))) condition.append(flag[i]!=int("%s" % (m[flag[i]]))) print(p) f.add(Or(condition))
|