| 
      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
      
      148
      
      149
      
      150
      
      151
      
      152
      
      153
      
      154
      
      155
      
      156
      | fromitertools importcombinationsfromitertools importproductfromitertools importpermutationsfromitertools importcombinations_with_replacementimporthashlibnumbers =[]dict={}anti ={}defgenNums():    items =['0', '1', '2']    forp inproduct(items, items, items, items):        #print(''.join(p))        if''.join(p) == '0000' or ''.join(p) == '1111' or ''.join(p) == '2222':            continue        k =''.join(p)        numbers.append(k)        arr =[]        fori inrange(4):            ifp[i] =='0':                arr.append(0)            elifp[i] =='1':                arr.append(1)            elifp[i] =='2':                arr.append(-1)            else:                print('unknown num'+p[i])        dict[k] =arr    print(dict)defsumItem(a, b):    ifa[0] +b[0] ==0anda[1] +b[1] ==0anda[2] +b[2] ==0anda[3] +b[3] ==0:        return0    #    raise Exception("invalid sum")defcheckItem(items):    forn inrange(4):        count =0        fori initems:            ifdict[i][n] ==0:                count +=1        ifcount !=13:            raiseException("invalid zero")    foritem incombinations(items, 2):        sumItem(dict[item[0]], dict[item[1]])defprintItems(items):    str=''    fori inrange(4):        foritem initems:            str+=item[i]    #print(str)    returnstrdefpermuteUnique(nums):    returnlist(set(permutations(nums)))defgenNum2():    data =list('0'*13+'1'*13+'2'*13)    all=permuteUnique(data)    print(len(all))    fori inall:        print(''.join(i))defgetInfo(l):    info =[0, 0, 0]    fori inl:        ifdict[i][1] ==0:            info[0] +=1        elifdict[i][1] ==1:            info[1] +=1        elifdict[i][1] ==-1:            info[2] +=1    returninfodefbrute2():    genNums()    array0 =[]    array12 =[]    array1 =[]    array2 =[]    tmp1 =[]    tmp2 =[]    dict01 ={}    dict02 ={}    fori incombinations(numbers, 2):        ifsumItem(dict[i[0]], dict[i[1]]) ==0:            anti[i[0]] =i[1]            anti[i[1]] =i[0]            ifi[0][0] =='0':                array0.append(list(i))            elifi[0][0] =='1':                array1.append(list(i)[0])                set1 =set(array1)        else:            print(i)            ifi[0][0] =='0':                ifnoti[0] indict01.keys():                    dict01[i[0]] =[]                ifnoti[0] indict02.keys():                    dict02[i[0]] =[]                ifi[1][0] =='1':                    dict01[i[0]].append(i[1])                elifi[1][0] =='2':                    dict02[i[0]].append(i[1])    #print(dict01)    fori0 inproduct(array0[0], array0[1], array0[2], array0[3], array0[4], array0[5], array0[6], array0[7], array0[8], array0[9], array0[10], array0[11], array0[12]):        l =list(i0)        l.sort()        set1 =set()        fori inl:            iflen(set1) ==0:                set1 =set(dict01[i])                #print(set1)            else:                set1 =set1 & set(dict01[i])        print(l, set1)        l1 =list(set1)        l1.sort()        fori1 incombinations(l1, 13):            tmp =list(set1 -set(i1))            tmp.sort()            l2 =[]            fori2 intmp:                l2.append(anti[i2])            l2.sort()            #print(l, list(i1), l2)            l1 =list(i1)            l1.sort()            info =getInfo(l)            info1 =getInfo(l1)            info2 =getInfo(l2)            ifinfo[0] +info1[0] +info2[0] ==13andinfo[1] +info1[1] +info2[1] ==13andinfo[2] +info1[2] +info2[2] ==13:                #print(l, l1, l2)                str=printItems(l+l1+l2)                ifhashlib.md5(str.encode()).hexdigest() =="aac82b7ad77ab00dcef90ac079c9490d":                    print(str)# Press the green button in the gutter to run the script.if__name__ =='__main__':    brute2() | 
根据提示信息和逆向分析结果,将爆破范围缩小到2^13*cn(13,26)数量级之后,进行爆破,得到flag
000000000000011111111111112222222222222000011111111100001122222220000011222222011100011122200120200112220112202001122101201201201212001212020120121202010201
更多【KCTF2023 第二题wp】相关视频教程:www.yxfzedu.com