网鼎-easy_ya



  • easy_ya

    crypto题
    nc连过去是pow_check(),先让你根据md5的前20位破解md5值。可以爆破,也可以网站破解。
    之后是token_check(),输入队伍的token就能得到数据。
    8c39936a-3451-415b-98f5-7863907df3eb-image.png

    数据后面四个数是n1,c1,n2,c2,因为n1和n2由共同的p和不同的q相乘得到的,所以通过辗转相除求公因数可以得到p和q,从而用rsa常规解法求得pow(s2n(ek),e,n)中的s2n(ek)了

    0x1f44b36a17076f1daced5L
    0x14e1a45b99d4c85a607e7L
    0xcb8e6c21de5e1e0fb69baL
    0x3b6b10f850f7555d6f639L
    0x188d272c839496a5582b8L
    n1=517571917999287130008773489388714504733039344957187331209752906130292464498251123522336840671026970943108931303610722819753583230363016506476328380949954327167273021260480233989161110331164344614430882143043942062596306103618907885033496403895760992015538030720214867442401271729689064712052696197896203277043502949076890606087148338602392851806165237729336514371298888668114929829113550671104044856129216699394543822202221512889586010791814719370642552820869004401286346286606205280002746733581069604350533545845569981131577360946106815776492831079158329058874801552270045330401651593313444453652593486860526016097960522164800988344177880501142470982640827441841593586288255163087684192648459495288412670661767587081762920661112108360217286707077243477940612159867355498336475931732380029604552201046434350651709968438230712345625526180717004543522317532860376502206853617292418406878379736437640512517365081176930298344459791255936710187193604173892497251965690158956113145056282915741596247089801889300945233379769265280721671481155150576260594321327027704180441165024138176800616695840964485323678526761224608513367184806240767968047137877727416650504273985381580100023679893850003756987874323413437528608492336201693383346760181
    c1=5132044145951202527426911561474023325256542602779008858686642604698295650612539329455070325416077970929034533870526781129630335925860803937951122161106048484400591447027195921363049290595230156648274222410164115808977196094992002575112473865438985758299049701084033367335919891172123137475373998336816596295037872596180505072884310414232304139301233735554966297433629963813838351304596548262610328167659470923967310244130186431479933643433069560426102319575443980682556401680854343996177192779187041955159721609198971361904262660709038014059274515934244279895924185365984407491435626231592901082077161486340253905032841797350818510455020497177555110834439564967003455582727692871702937103962214212007386136010909829437176048070286547868482875389479076706709774620823712940575267371285105544447953875096740823224664768801496745463388327292645763515010938807354922679913844357943080687058029257121921882733239785527957396519654449910253750426191366385603111002003540096051754813155144955762895683998161740156339756266395977206088462898630739881947273507423714179048372471182921739418482704926913472930890108296301046072388742311218903148637267479984223380452935137563813019944099780391907308416928784757283657099612567922046140039619
    n2=386221617646614744055349673281616864258090601576199326593771098372399277279935236207206211960190759162716110559579678999205332824103088504258700306171767585882745814803630268425092551808391038466830701872867263842330800897594909088193196359375209549068922449846234703881785363725629285188434624051375182660212609237239754126809432238965547908305921869725381166471278917563886819125109605265650583666764485490332541552079087022864249594871058143523391545337853200568701066884289365801745643519749989137791321087813113144722611081601524525984182304533257339910720410799119562165835710594797231816855393723479684135525322943511110067981166721515317214559179672543285689577083741950123917329743506444092546597903788748729302042782816468896770110219210175229607466526821273760476966376632749058012764703484841231957516422983235572169244035343372508717232657077719490957944526492478634034645229864679433620815524313079648300338576021320536157965115831902111399601972220731921857794712707110595668229437956410061859723023284930735797983760260000844011448784593669525765494999091751218259917116556766723159251193660322320579936580712130736586674317896971198730166447465874269482431922305881993447564281453060432210126636817444225995347554583
    c2=185331138306988054276530829435619832906575681731477489225837425873060839184576434361425355697036304339612605403596816005946732328801407776741457762311998096655654815831484617294556164346913095726717280400188938206798543283913683616678208958083275897094426119169649590346273337047916167264204566313747866022623801902594642799456397637932590831303888409074731919560743618728600953254666752282256793652240190189928813562449292747269945395027553491530494433324881618577919432098311948887983038666314425053361843385098919282412624481215116036892967523526428553109420824859558193750845655128258557671495059554470670824361729774182123628304615529469540537151552280447047115601309713621247833239646999234238685291961318954962969917280137003582157433461149382541267057166429677813472339814028676349380368136195041227140943191913403161898704428210380567103659474175393231179937341231400253222064569605145698136779891594663078154172816088887925866737589784766925001426866243845146168550898037292076132662057367217445719628673572453647376972765078833245448085473529541800726793611495135005676236269205801513958474025374968967998368595303955596919183693123732560585159997549856384653715111581077814924066136566418827678373538656865319636037605103
    

    s2n(ek):e684bfe68891e68980e788b1e697a0e5bfa7e68199e5b281e9 95bfe5ae89
    ascii:愿我所爱无忧恙岁长安

    padding="\xe6\xe6\xe7\xe6\xe5\xe6\xe5\xe9\xe5"
    ek='\xe6\x84\xbf'
    for i in range(9):
        ek+=padding[i] + key[2*i:2*i+2]
    

    从而可以继续求出key和Key的值
    key="\x88\x91\x89\x80\x88\xb1\x97\xa0\xbf\xa7\x81\x99\xb2\x81\x95\xbf\xae\x89"
    Key=[136, 145, 137, 128, 136, 177, 151, 160, 191, 167, 129, 153, 178, 129, 149, 191, 174, 137]

    def encode(key,data):
        pad  = randint(0x10000000,0xffffffff)
        Key  = [ord(i) for i in key]
        Data = [ord(i) for i in data]
        a = limit((Key[0] << 24) | (Key[1] << 16) | (Key[2] << 8) | Key[3])
        b = limit((Key[4] << 24) | (Key[5] << 16) | (Key[6] << 8) | Key[7])
        c = limit((Key[8] << 24) | (Key[9] << 16) | (Key[10] << 8) | Key[11])
        d = limit((Key[12] << 24) | (Key[13] << 16) | (Key[14] << 8) | Key[15])
        y = limit((Data[0] << 24) | (Data[1] << 16) | (Data[2] << 8) | Data[3])
        z = limit((Data[4] << 24) | (Data[5] << 16) | (Data[6] << 8) | Data[7])
        pads = 0
        for j in range(32):
            pads = limit(pads + pad)
            y = limit( y + ((z*16 + a) ^ (z + pads) ^ ((z>>5) + b)))
            z = limit( z + ((y*16 + c) ^ (y + pads) ^ ((y>>5) + d)))
        print hex((y << 52) ^ (pads << 20) ^ z)
    

    知道Key也很容易求出a,b,c,d的值
    a=2291239296
    b=2293340064
    c=3215425945
    d=2994836927
    (做到这比赛就结束了😢
    继续,接下来就是前四个数的解密了。

    print hex((y << 52) ^ (pads << 20) ^ z)
    

    可以看出输出前32位是y,33-54位是pads的前20位,55-64是pads的后12位和z的前12位异或的结果
    for循环了32次,pads为limit(32*pad),其后5位是0,前5位未知,6-12位未知(二进制下),所以还要爆破(2^12)

    借鉴了大佬的脚本:

    #python3.7  
    from libnum import n2s,s2n                 
    import string
    limit = lambda n: n & 0xffffffff
    a=2291239296
    b=2293340064
    c=3215425945
    d=2994836927
    outputs = [0x1f44b36a17076f1daced5,0x14e1a45b99d4c85a607e7,0xcb8e6c21de5e1e0fb69ba,0x3b6b10f850f7555d6f639,0x188d272c839496a5582b8]
    def reversecalc(a,b,c,d,y,z,pad):
        for i in range(32,0,-1):
            pads = limit(int(pad * i))
            paramz = (y*16+c)^(y+pads)^((y>>5)+d)
            if(z < paramz):
                z = limit(z - paramz + 0x100000000)
            else:
                z = limit(z - paramz)
            paramy = (z*16+a)^(z+pads)^((z>>5)+b)
            if(y < paramy):
                y = limit(y - paramy + 0x100000000)
            else:
                y = limit(y - paramy)
        return y,z
    
    for output in outputs:
        print(hex(output))
        binout = bin(output)[2:]
        binout = '0'*(84-len(binout))+binout
        y = int(binout[:32],2)
        for i in range(4096):
            bini = bin(i)[2:]
            bini = '0'*(12-len(bini))+bini
            tmpbinpads = bini[0:5] + binout[32:52] + bini[5:12] + '00000'
            pad = int(tmpbinpads,2) / 32
            pads = limit(int(tmpbinpads,2))
            z = output ^ (y<<52) ^ (pads<<20)
            y0,z0 = reversecalc(a,b,c,d,y,z,pad)
            try:
              tmpstr = n2s(y0)+n2s(z0)
              valid = True
              for j in tmpstr:
                  if (not j in string.printable)and(j != '\x00'):
                      valid = False
                      break
              if(valid):
                  print(tmpstr)
            except:
              continue
    

    f8b97443-7413-44e3-9c63-0d208dd04f1e-image.png

    从中找到flag

    大佬的crypto链接
    https://blog.csdn.net/cccchhhh6819/article/details/106038866/


Log in to reply