找回密码
 会员注册
查看: 18|回复: 0

2024_ctfshow_西瓜杯复现

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
64422
发表于 2024-9-2 21:40:55 | 显示全部楼层 |阅读模式
前言整体来说,这次的西瓜杯的题目非常有意思,收获还是挺多的。大家可以去ctfshow上面复现复现网址链接:ctf.show官方wp:XGCTF(西瓜杯官方wp)MISC她说她想结婚考点:文件分离,snow隐写,0kb文件隐写,oursecret隐写,base解码先解压得到一张图片,常规放入010查看发现后面有一些乱码字符和一个压缩包,先手动提取压缩包。提取后直接解压可能会出现问题,我当时就是卡在这了(悲),需要先修改伪加密,即将14000900全部替换为14000000,然后再解压。看见flag文件,直接打开看看怎么个事发现全是非中文字符,是编码问题,不麻烦可以直接拖到浏览器,后面面明显的SNOW隐写,那就要找密码了。可以看到文本似乎全是重复这一段话的,根据图片上的文字和提示可以知道密码是你们耳朵是聋了吗使用SNOW隐写工具得到前半段flag根据iscc的经验还有文件明显特征,我们知道前面文件是时间戳隐写,使用脚本直接提取,脚本如下importosfilename="C:\\Users\\atlan\\Downloads\\1\\10.txt"file_attr=os.stat(filename)#读取文件属性alter_time=file_attr.st_mtime#获取修改时间print(alter_time)importosforiinrange(11):filename="C:\\Users\\atlan\\Downloads\\1\\{0}.txt".format(i)file_attr=os.stat(filename)#读取文件属性alter_time=str(file_attr.st_mtime)#获取修改时间print(chr(int(alter_time[7:10])),end='')运行得到key:ctfSh0w前面我们说到png文件尾和zip文件头之间还有一些乱码之类的东西,9E97BA2A,这个是oursecret的加密特征根据上面得到的key,放入oursecret解密,得到base64编码,一直解密得到后半段flag:happy_time_pl4ying}flag值:ctfshow{W1sh1ng_every0ne_4_happy_time_pl4ying}你是我的眼打开是一个jar文件,使用jadx反编译工具直接打开,查看源码查看main类,代码意思是先将Q1RGU2hvd3tURVNUX0JBU0U2NF9CSUFOTUF9Xw-字符串使用customDecode()方法进行解码,再将解码后的“_”和“\u000f”替换为空再看prompt类,是将空格替换为“_”综上,先解码,再把下划线替换的位置换为空,还需要再换回来,所以直接解码就是flagflag值:CTFShow{TEST_BASE64_BIANMA}SignIn一张图片,隐藏着三个二维码,直接使用Tokeii神的工具梭直接放入我们得到第二段flag2Rc0de_,将预计二维码个数调高一点,得到剩余两段flagflag:ctfshow{Ai_Art_QRc0de_iS_Amz!}CRYPTO奇怪的条形码使用画图工具调整长宽像素大小,再经过base64解码得到flagflag值:ctfshow{xigubei_misc_gram_here_flag}简单密码题目给出一串字符,像是十六进制字符,尝试直接解码失败647669776d757e83817372816e707479707c888789757c92788d84838b878d9d发现ctfshow的十六进制为63746673686f77,刚好是题目给出的十六进制两位转字符,第i个字符减去i得到的,根据此规律写脚本str="647669776d757e83817372816e707479707c888789757c92788d84838b878d9d"str=bytes.fromhex(str)flag=''foriinrange(len(str)):tmp=str[i]-i-1flag+=chr(tmp)print(flag)#ctfshow{xiguabei_just_ez_signin}flag值:ctfshow{xiguabei_just_ez_signin}factorfromCrypto.Util.numberimport*importgmpy2importosfromencimportflaghint=os.urandom(36)tmp=bytes_to_long(hint)m=bytes_to_long(flag)p=getPrime(512)q=getPrime(512)d=getPrime(400)phi=(p-1)*(q-1)e=gmpy2.invert(d,phi)n=p*qc=pow(m,e,n)leak1=p^tmpleak2=q^tmpprint(f"n={n}")print(f"e={e}")print(f"c={c}")print(f"leak1={leak1}")print(f"leak2={leak2}")'''n=145462084881728813723574366340552281785604069047381248513937024180816353963950721541845665931261230969450819680771925091152670386983240444354412170994932196142227905635227116456476835756039585419001941477905953429642459464112871080459522266599791339252614674500304621383776590313803782107531212756620796159703e=10463348796391625387419351013660920157452350067191419373870543363741187885528042168135531161031114295856009050029737547684735896660393845515549071092389128688718675573348847489182651631515852744312955427364280891600765444324519789452014742590962030936762237037273839906251320666705879080373711858513235704113c=60700608730139668338977678601901211800978306010063875269252006068222163102100346920465298044880066999492746508990629867396189713753873657197546664480233269806308415874191048149900822050054539774370134460339681949131037133783273410066318511508768512778132786573893529705068680583697574367357381635982316477364leak1=13342820281239625174817085182586822673810894195223942279061039858850534510679297962596800315875604798047264337469828123370586584840078728059729121435462780leak2=10901899434728393473569359914062349292412269512201554924835672710780580634465799069211035290729536290605761024818770843901501694556825737462457471235151530'''分析:tmp相当于一个随机数了,leak1=p^tmp,leak2=q^tmp,根据异或的性质可以知道leak1^leak2=p^q,接下来直接使用p^q的脚本解题得到flagimportgmpy2importlibnumn1=145462084881728813723574366340552281785604069047381248513937024180816353963950721541845665931261230969450819680771925091152670386983240444354412170994932196142227905635227116456476835756039585419001941477905953429642459464112871080459522266599791339252614674500304621383776590313803782107531212756620796159703leak1=13342820281239625174817085182586822673810894195223942279061039858850534510679297962596800315875604798047264337469828123370586584840078728059729121435462780leak2=10901899434728393473569359914062349292412269512201554924835672710780580634465799069211035290729536290605761024818770843901501694556825737462457471235151530x1=leak1^leak2x1=bin(x1)[2:].zfill(512)pre_sol=[(0,0)]forxinrange(512-1,-1,-1):cur_pow=pow(2,len(x1)-x-1)print(cur_pow)cur_sol=[]forp,qinpre_sol:foriinrange(2):forjinrange(2):ifstr((i+j)%2)==x1[x]:cur_p=p+i*cur_powcur_q=q+j*cur_powifcur_p*cur_q%pow(2,len(x1)-x)==n1%pow(2,len(x1)-x):cur_sol.append((cur_p,cur_q))pre_sol=cur_solforp,qinpre_sol:ifp*q==n1:print(p,q)breakn=n1e=10463348796391625387419351013660920157452350067191419373870543363741187885528042168135531161031114295856009050029737547684735896660393845515549071092389128688718675573348847489182651631515852744312955427364280891600765444324519789452014742590962030936762237037273839906251320666705879080373711858513235704113c=60700608730139668338977678601901211800978306010063875269252006068222163102100346920465298044880066999492746508990629867396189713753873657197546664480233269806308415874191048149900822050054539774370134460339681949131037133783273410066318511508768512778132786573893529705068680583697574367357381635982316477364phi=(p-1)*(q-1)d=gmpy2.invert(e,phi)m=pow(c,d,n)print(libnum.n2s(int(m)))#cftshow{do_you_know_what_is_xor_and_prune!!!}混合密码体系#库fromCrypto.Util.numberimportbytes_to_long,getPrimefromCrypto.CipherimportAESfromCrypto.Util.Paddingimportpad#对称加密flag=b'ctfshow{***}'#密文,隐藏key=b'flag{***}'#会话密钥,隐藏iv=b'flag{1fake_flag}'#AES偏移向量,已知#对明文进行填充,使其长度符合AES加密的要求padded_plaintext=pad(flag,AES.block_size)#创建AES加密对象cipher=AES.new(key,AES.MODE_CBC,iv)#加密ciphertext=cipher.encrypt(padded_plaintext)#加密后的文本通常是字节串,转成整数便于进行会话密钥的RSA加密c1=bytes_to_long(ciphertext)print(f'c1={c1}')#非对称加密m=bytes_to_long(key)e=0x10001p=getPrime(1024)q=getPrime(1024)n=p*qc=pow(m,e,n)print(f'p={p}')print(f'q={q}')print(f'n={n}')print(f'c2={c}')#print("hint:key需要转成字节流也就是b''")'''c1=10274623386006297478525964130173470046355982953419353351509177330015001060887455252482567718546651504491658563014875p=126682770761631193509957156425049279522830651950325320826580754739365086374362604934854454428815835196844469535588686149210573266628767888593088817059600076401582225549728184309047483547810100015820325082976781284679340880386138390518973395696206374336712856387090369022746536868747455939074262253452873845903q=99825079362327808334563489684167271427241139432727401182808888165552821217781929397837262324242177528386988701584385208395369790542025175917752058047649096340776854252623173162664426065810683048016574420043010318337693586527652970534982946701493024718805916479479658257730226388868060010370893747360166996939n=12646117645119414744807511144503229609414192869007113075368323921021672404219693075011763838210400633721060798765473421092201704833591315689681668160927426685183273670665030724394172000165517517884654100267567861284096827407481978978840602383267875832034344793848710383473014512122260278131503985961857107838296047172582364612603344429943715046318283653354068887129071531081918798285138812386418361474496678248683513378861801570673376726388110813411011818940310547686977359605296489433805717348250520973842927175837164120905300831792358190183785344002217291207378744610039145999012939983693891188308725179098958690917c2=5211902378262010726785508340196935051860438587769647187076059600864676774592415052428465708887047312982844957691943180258845015420187239772414768121857728821510440178906193308448250067671679439841031484589864038401572589752057423667532898133171822921282769652197139455317095891357335645435094243006629469245881345449943250189771998449015275390517315432969774421721243965028796050948747282387052634211032729131656214346307483397410725129682422969273915759947596313513270946529649661334582775282060624547405060499311618257517792321792697831000977711752728887999320311631022598717946355057272761740061999974856808147244'''分析:本质上就是使用了RSA数据的AES解密题,已知p,q,e,c,可以用基础脚本直接得到keyimportlibnume=65537p=126682770761631193509957156425049279522830651950325320826580754739365086374362604934854454428815835196844469535588686149210573266628767888593088817059600076401582225549728184309047483547810100015820325082976781284679340880386138390518973395696206374336712856387090369022746536868747455939074262253452873845903q=99825079362327808334563489684167271427241139432727401182808888165552821217781929397837262324242177528386988701584385208395369790542025175917752058047649096340776854252623173162664426065810683048016574420043010318337693586527652970534982946701493024718805916479479658257730226388868060010370893747360166996939n=12646117645119414744807511144503229609414192869007113075368323921021672404219693075011763838210400633721060798765473421092201704833591315689681668160927426685183273670665030724394172000165517517884654100267567861284096827407481978978840602383267875832034344793848710383473014512122260278131503985961857107838296047172582364612603344429943715046318283653354068887129071531081918798285138812386418361474496678248683513378861801570673376726388110813411011818940310547686977359605296489433805717348250520973842927175837164120905300831792358190183785344002217291207378744610039145999012939983693891188308725179098958690917c=5211902378262010726785508340196935051860438587769647187076059600864676774592415052428465708887047312982844957691943180258845015420187239772414768121857728821510440178906193308448250067671679439841031484589864038401572589752057423667532898133171822921282769652197139455317095891357335645435094243006629469245881345449943250189771998449015275390517315432969774421721243965028796050948747282387052634211032729131656214346307483397410725129682422969273915759947596313513270946529649661334582775282060624547405060499311618257517792321792697831000977711752728887999320311631022598717946355057272761740061999974856808147244n=p*qphi_n=(p-1)*(q-1)#求逆元d=libnum.invmod(e,phi_n)m=pow(c,d,n)print(m)#数字转字节,转字符串print(libnum.n2s(int(m)).decode())#flag{**********}得到key的值,有了key和iv,再写脚本将c1进行AES解密,得到flagfromCrypto.Util.numberimportbytes_to_long,getPrime,long_to_bytesfromCrypto.CipherimportAESfromCrypto.Util.Paddingimportunpadimportgmpy2c1=10274623386006297478525964130173470046355982953419353351509177330015001060887455252482567718546651504491658563014875iv=b'flag{1fake_flag}'key=b'flag{**********}'cipher=AES.new(key,AES.MODE_CBC,iv)flag=cipher.decrypt(long_to_bytes(c1))print(unpad(flag,AES.block_size))#ctfshow{Hybrid_password_system_is_chaos}flag值:ctfshow{Hybrid_password_system_is_chaos}REpe修复PE文件头,把ZM改成MZ,运行就能得到flagflag值:CTFShow{i95f5417b37c5e8019372de8737fI}探索进制转换的奥秘先查壳,无壳,32位程序,直接用IDA打开直接就能看到一串十六进制字符,解码就得到flagflag值:CTFShow{Thank_CTFSHOW_Sky}一个西瓜切两半你一半我一半在线pyc反编译分析一下脚本:先依次提取flag里的字符,将其ASCII码减去32,然后将其转换回字符,存到tmp里,再将tmp中每个字符ASCII码与key字符串中对应位置的字符的ASCII码相加,然后将其转换回字符,将字符添加到crypt字符串中。接下来就直接写脚本key="一个西瓜切两半你一半我一半"crypt="乃乾觅甯剏乳厡侻丨厏扝乌博丿乜规甲剌乶厝侥丿卻扚丠厘丿乎覟瓬剤"tmp=""foriinrange(len(crypt)):tmp+=chr(ord(crypt[i])-ord(key[i%len(key)]))flag=''foriintmp:flag+=chr(ord(i)+32)print(flag)#ctfshow{Hell0_Reverse_Qi@n_D@0}flag值:ctfshow{Hell0_Reverse_Qi@n_D@0}EIDA打开,shift+f12快速查找字符串,看到一串base64编码的字符串,解码,得到flagflag值:CTFSHOW{JIAMI_SHOW_YAN}WEBCodeInject
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-26 23:09 , Processed in 0.397046 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表