网鼎-easy_ya
-
easy_ya
crypto题
nc连过去是pow_check(),先让你根据md5的前20位破解md5值。可以爆破,也可以网站破解。
之后是token_check(),输入队伍的token就能得到数据。
数据后面四个数是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
从中找到flag
大佬的crypto链接
https://blog.csdn.net/cccchhhh6819/article/details/106038866/