前言
emojiCFTF的时间刚刚好和日本seccon beginner ctf时间撞了,打完以后还忘了,复现一下,总体不难。
题目
签到
task
0111001001111010011000100111011101110110010100000100011101010011011110110011000101100111010111110101011000110101010111110100111001100001010111110011001101101110010001100110110001011111010100000110010101101100010000110011011100110000010111110100011000110001011101000110000101111101
思路:见到这玩意只有01就是二进制,转换之后随波逐流一把梭哈,得到flag
emojiCTF{1t_I5_An_3aSy_CryP70_S1gn}
R-S-A
task
p-q = -46236078916549469271802793965557722144897322057672876144545242139446240226111541132163219350710311406692169786779818055552058688003791247600228896615087481203070512609124209965724061308056358663231268506936741415415768917964151901326838609900654924585209867452564681636095663275237687227446348557391615285084 e = 1924281535250040947727405246795833571179937552846219865784568535754592283409161593462123435569482686253708817293718484446217007144655183004134034477738262087690784955575547568582957769370586880551869135535634524855220102092794534416148986750993591926174112800326815501955451584075737092232544596212328031504791004338345071954592690450258647570356381017232949170578642961069394469532695515559630978411928545550282615493593247414418633233726673009952264375398655155718249749190585024550862014537921334625461229216364876368372739746172757293595928518046405203444282780487645173416195416921983234722803027769872757529323 c = 784465137180095430875420569094169523740702307119391434720077815196069851129567763746967656823362483051572358635760209837038013491732302017752223762815140954669371777658442907641626773411124996578941382310539627151060499940514704164786494164639265453257845352081975160532243212301972094412004347077847162748919152653008511321533950208444032140708619752731303212746495788277292106408276806834000581380680055145086689649810444200934202011586661073531037110262845003214257566247675909445369731395424697604433196590534600456011910891309633078881367017676551664741239997791589791400680297806530771300467650720044159266086 n = 3593973503765695552536586064471213253083393356156101939564784662194108469922509225714104966775581106151796569388207536437126460190627434962930334395058701061521034312445065016436347013644098439365010032444679707361444926626650850965293066787721143399211808844855328667539673523020881294872209713816175692279560892842095434295930701367047732403574116232248961594083861311915867206775123198727131776460679449764309835279150536339881397304356924272152848186442391708606829622180583807108589813397615300537217540251934475075511681297125266463961043609344692763205054837803386167206508770624304964934831382938507949363717
思路:直接解方程
exp
x= e= c= n= from Crypto.Util.number import * from sympy import * p,q= symbols('p q') r=solve([p*q-n,p-q-x],(p,q)) print(r) p=41134721199614846339207347806375867546276823794491945446614761975942547957773582204978153634049613637314717610289970843740388214855727193467007213790334693770434255851473826703338574163904550560445073137386694909495348200132086417317620038813724450319430171662156174371118188836770282611033087083452104052149 q=87370800116164315611010141771933589691174145852164821591160004115388788183885123337141372984759925044006887397069788899292446902859518441067236110405422174973504768460598036669062635471960909223676341644323436324911117118096238318644458648714379374904640039114720856007213852112007969838479435640843719337233 phi=(p-1)*(q-1) d=inverse(e,phi) m=pow(c,d,n) print(long_to_bytes(m)) #emojiCTF{QvUaEdkflIQf0Klt6Iu8fZvU}
R^S^A
task
e = 65537 n = 17626392212279375795672017937809976432819563702015014286064950438576962829301599887424832742209378051687822421703316130192020970941676594734073337248659576926575409659609517516571173738767919910420753227081676651612998092451924002173008602428197941864705971469948068681614565308570894501692597579202715649837935866803849514492857112054684416002104812289864567355883456430042148145799939586951625034025707736407538180102611049391900268512837878848560854682228074168583637013599117615137668041018375469762511166636852906124939919673060420023287056647653925858064479788117341253962554259945839612998710315288660915390543 leak= 89884656743115795386465259394234594567546130199363180708002290807487206865805972417279697354950018128772500146302322028511803484668179089220615193364070482772703954931838536681720469410883560665407216805250546708783249336389502139655454481491246187888957907623426449041503701395627092371546762192998918782974 p^q = 15353396223606692204253354833233067114199996528916790997604347786403456282543682138297916126293312135032558534636934734869807941321225203411903129720253717772393747501562673454929926513518070604475902448091242766771949079887693901769148980379739977262744450451505364499178273015141584500087580192421701748750836209109487246092666869218702274453456508100997255478700791800921353303116505094139865456937359493463506797519849430510917719026559539965791391845554621890357123251984800601113044355173099746170929775677870786702159862756844911828296490556988779325757045280115604388611000559427604324936039138667153453277427
思路:很经典的剪枝算法,也叫关联爆破?
原理就是p与q在xor时,每一位的结果只有0或1,而每一位的组合也只有四种,[0,1] [0,0] [1,0] [1,1],那我就可以枚举爆破每一位,从而得到p和q
exp
e = 65537 n = 17626392212279375795672017937809976432819563702015014286064950438576962829301599887424832742209378051687822421703316130192020970941676594734073337248659576926575409659609517516571173738767919910420753227081676651612998092451924002173008602428197941864705971469948068681614565308570894501692597579202715649837935866803849514492857112054684416002104812289864567355883456430042148145799939586951625034025707736407538180102611049391900268512837878848560854682228074168583637013599117615137668041018375469762511166636852906124939919673060420023287056647653925858064479788117341253962554259945839612998710315288660915390543 leak= 89884656743115795386465259394234594567546130199363180708002290807487206865805972417279697354950018128772500146302322028511803484668179089220615193364070482772703954931838536681720469410883560665407216805250546708783249336389502139655454481491246187888957907623426449041503701395627092371546762192998918782974 c = 15353396223606692204253354833233067114199996528916790997604347786403456282543682138297916126293312135032558534636934734869807941321225203411903129720253717772393747501562673454929926513518070604475902448091242766771949079887693901769148980379739977262744450451505364499178273015141584500087580192421701748750836209109487246092666869218702274453456508100997255478700791800921353303116505094139865456937359493463506797519849430510917719026559539965791391845554621890357123251984800601113044355173099746170929775677870786702159862756844911828296490556988779325757045280115604388611000559427604324936039138667153453277427 from Crypto.Util.number import * def get_pq(n, x): a = [0] b = [0] maskx = 1 maskn = 2 for i in range(1024): xbit = (x & maskx) >> i nbit = n % maskn t_a = [] t_b = [] for j in range(len(a)): for aa in range(2): for bb in range(2): if aa ^ bb == xbit: tmp2 = n % maskn tmp1 = (aa * maskn // 2 + a[j]) * (bb * maskn // 2 + b[j]) % maskn if tmp1 == tmp2: t_a.append(aa * maskn // 2 + a[j]) t_b.append(bb * maskn // 2 + b[j]) maskx *= 2 maskn *= 2 a = t_a b = t_b for a1, b1 in zip(a, b): if a1 * b1 == n: return a1, b1 print(get_pq(n, leak)) p=111333928633384039248787825266058380102564302610683774296735138323796885440325522301302649130522397716710525859927661834447462648801231320790381330762200244351951324675928016721869115489370317719639192101136412298885878342628245496531456558511102222180443848548963347176474520255844896524252794434180745626041 q=158320041595963346910607953497511695075001758433674691713888017753105291655382379900703870377303844238937087600854108033755563228292880298246860058356388698143578740680103975150537695645088531644826282534286488017240804391039495063039781633438590238645412596002890423433811285116929743283890906195989612887623 phi=(p-1)*(q-1) d=inverse(e,phi) m=pow(c,d,n) print(long_to_bytes(m)) #flag{2c50b32a-fe84-4f1f-a645-22dcc4caa9b9}
小e
task
数据太多,就不列出来了,就是给了三十一组n和c
思路:经典的crt,但是没有给e,题目上面说了e小,那么直接循环e就好了
exp
from Crypto.Util.number import * from sympy.ntheory.modular import crt import gmpy2 n=[n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17,n18,n19,n20,n21,n22,n23,n24,n25,n26,n27,n28,n29,n30,n31] c=[c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17,c18,c19,c20,c21,c22,c23,c24,c25,c26,c27,c28,c29,c30,c31] x=crt(n,c) for e in range(100): try: m=gmpy2.iroot(x[0],e)[0] flag=long_to_bytes(m) if b'emoji' in flag: print(flag) break except: pass #emojiCTF{9QWcaxL7LauCeEF7SMg5Kpxc}
登录系统
task
import socketserver from gmssl import sm3, func import os from secret import flag class LoginHandler(socketserver.BaseRequestHandler): def handle(self): salt = os.urandom(32) salt_list = func.bytes_to_list(salt) self.request.sendall(b"*********************\n") self.request.sendall("登录系统\n".encode()) self.request.sendall(b"*********************\n") self.request.sendall(b"salt_hash: " + sm3.sm3_hash(salt_list).encode('utf-8') + b"\n") self.request.sendall("请输入登录的username:\n".encode()) name = self.request.recv(1024).strip() if b"admin" not in name: self.request.sendall("只允许admin\n".encode()) return name_list = func.bytes_to_list(name) finall_list = func.bytes_to_list(salt) finall_list.extend(name_list) finall_hash = sm3.sm3_hash(finall_list) self.request.sendall("请输入salt+username的hash以验证登录\n".encode()) user_hash = self.request.recv(1024).strip().decode('utf-8') if user_hash == finall_hash: self.request.sendall("登录成功!\n".encode()) self.request.sendall(flag.encode('utf-8') + b"\n") else: self.request.sendall("登录失败!\n".encode()) if __name__ == "__main__": HOST, PORT = "0.0.0.0", 8800 with socketserver.TCPServer((HOST, PORT), LoginHandler) as server: print(f"Server started at {HOST}:{PORT}") server.serve_forever()
思路:一个关于sm3加密的题,先审计代码,我们知道salt_list的hash值,登录时只允许有admin的名字,并且没有长度限制,然后就要知道sm3加密的原理,可知和md5差不多,关键在于他在大于512bits时会把这次加密的值当作下一个加密的iv值,那么在这个题目里,我们只需要去绕过去就好了。这时候我们只要将salt构造成hash加密前预处理填充时的状态,然后再添上我们想要输入的值,这里就是admin,将这一串进行普通的sm3加密,就是final_hash,final_hash的过程就是对admin前的512bit进行sm3加密,得到一个hash,就是salt_hash,然后再将salt_hash当作iv值对admin进行sm3加密。这时候我们就可以用一开始得到的salt的hash值,直接对admin进行sm3加密,就是最后的结果.
具体使用了这个佬的代码,从而去改变值。
exp
from pwn import * from gmssl import sm3,func from Crypto.Util.number import * from length_extension_attack_for_SM3 import * p=remote("gz.imxbt.cn",20047) p.recvuntil(b'salt_hash: ') salt_hash=p.recvline().decode() name=b'\x80'+b'\x00'*29+b'\x01\x00admin' p.sendline(name) user_hash=SM3_len_ex_ak(1,salt_hash,"61646d696e") p.sendline(user_hash.encode()) p.interactive() #emojiCTF{65342dd0-6888-44ea-bde9-39d509a25459}