Navigation

    喵了个咪乎

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    网鼎-easy_ya

    学习打卡区
    1
    1
    5
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • 林
      林航锌 last edited by

      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/

      1 Reply Last reply Reply Quote 0
      • First post
        Last post