HGAME 2024 WEEK2 Crypto Misc

打印 上一主题 下一主题

主题 919|帖子 919|积分 2757

CRYPTO

midRSA

题目描述:兔兔梦到自己变成了帕鲁被crumbling抓去打黑工,醒来后连夜偷走了部分flag
  1. from Crypto.Util.number import *
  2. from secret import flag
  3. def padding(flag):
  4.     return flag+b'\xff'*(64-len(flag))
  5. flag=padding(flag)
  6. m=bytes_to_long(flag)
  7. p=getPrime(512)
  8. q=getPrime(512)
  9. e=3
  10. n=p*q
  11. c=pow(m,e,n)
  12. m0=m>>208
  13. print(f'n={n}')
  14. print(f'c={c}')
  15. print(f'm0={m0}')
  16. """
  17. n=120838778421252867808799302603972821425274682456261749029016472234934876266617266346399909705742862458970575637664059189613618956880430078774892479256301209695323302787221508556481196281420676074116272495278097275927604857336484564777404497914572606299810384987412594844071935546690819906920254004045391585427
  18. c=118961547254465282603128910126369011072248057317653811110746611348016137361383017921465395766977129601435508590006599755740818071303929227578504412967513468921191689357367045286190040251695094706564443721393216185563727951256414649625597950957960429709583109707961019498084511008637686004730015209939219983527
  19. m0=13292147408567087351580732082961640130543313742210409432471625281702327748963274496942276607
  20. """
复制代码
我的解答:
考点:m高位泄露exp:
  1. from Crypto.Util.number import long_to_bytes
  2. e= 3
  3. n=120838778421252867808799302603972821425274682456261749029016472234934876266617266346399909705742862458970575637664059189613618956880430078774892479256301209695323302787221508556481196281420676074116272495278097275927604857336484564777404497914572606299810384987412594844071935546690819906920254004045391585427
  4. c=118961547254465282603128910126369011072248057317653811110746611348016137361383017921465395766977129601435508590006599755740818071303929227578504412967513468921191689357367045286190040251695094706564443721393216185563727951256414649625597950957960429709583109707961019498084511008637686004730015209939219983527
  5. m_high=13292147408567087351580732082961640130543313742210409432471625281702327748963274496942276607
  6. m_high <<= 208
  7. R.<x> = PolynomialRing(Zmod(n))
  8. m = m_high + x
  9. f = m^e - c
  10. x = f.small_roots(X = 2^208,beta = 0.4)
  11. if x:
  12.         m = m_high + x[0]
  13.         print(long_to_bytes(int(m)))
  14. #hgame{0ther_cas3s_0f_c0ppr3smith}
复制代码
我的解答:背包密码签到题,直接梭。参考:戳我!!!exp:
  1. from Crypto.Util.number import *
  2. import random
  3. from secret import flag
  4. a=[getPrime(32) for _ in range(20)]
  5. p=random.getrandbits(32)
  6. assert len(bin(p)[2:])==32
  7. bag=0
  8. for i in a:
  9.     temp=p%2
  10.     bag+=temp*i
  11.     p=p>>1
  12. enc=bytes_to_long(flag)^p
  13. print(f'enc={enc}')
  14. print(f'a={a}')
  15. print(f'bag={bag}')
  16. """
  17. enc=871114172567853490297478570113449366988793760172844644007566824913350088148162949968812541218339
  18. a=[3245882327, 3130355629, 2432460301, 3249504299, 3762436129, 3056281051, 3484499099, 2830291609, 3349739489, 2847095593, 3532332619, 2406839203, 4056647633, 3204059951, 3795219419, 3240880339, 2668368499, 4227862747, 2939444527, 3375243559]
  19. bag=45893025064
  20. """
复制代码
 babyRSA

题目描述:emmm,找到e就好了,吧?
  1. #sage
  2. import libnum
  3. enc = 871114172567853490297478570113449366988793760172844644007566824913350088148162949968812541218339
  4. M = [3245882327, 3130355629, 2432460301, 3249504299, 3762436129, 3056281051, 3484499099, 2830291609, 3349739489, 2847095593, 3532332619, 2406839203, 4056647633, 3204059951, 3795219419, 3240880339, 2668368499, 4227862747, 2939444527, 3375243559]
  5. S = 45893025064
  6. n = len(M)
  7. Ge = Matrix.identity(n)
  8. last_row = [0 for x in range(n)]
  9. Ge_last_row = Matrix(ZZ, 1, len(last_row), last_row)
  10. last_col = M[:]
  11. last_col.append(S)
  12. Ge_last_col = Matrix(ZZ, len(last_col), 1, last_col)
  13. Ge = Ge.stack(Ge_last_row)
  14. Ge = Ge.augment(Ge_last_col)
  15. X = Ge.LLL()[-1]
  16. X = X[:-1]
  17. p = ""
  18. for i in X:
  19.     if abs(i) == 1:
  20.         p += "1"
  21.     if abs(i) == 0:
  22.         p += "0"
  23.         
  24. print(p)
  25. m = int(p,2) ^^ enc
  26. print(m)
  27. flag = bytes.fromhex(hex(int(m))[2:])
  28. print(flag)
  29. # hgame{M@ster_0f ba3kpack_m4nag3ment!}
复制代码
我的解答:我们有:gift = (e+114514+pk)65537 (mod p)化简得:gift = (e+114514)65537 (mod p)解RSA可得到e,也就照应了题目所说。。另外,我们还发现e和phi不互素,可以使用nth_root(用法参考:HWS-random)处理exp:
  1. from Crypto.Util.number import *
  2. from secret import flag,e
  3. m=bytes_to_long(flag)
  4. p=getPrime(64)
  5. q=getPrime(256)
  6. n=p**4*q
  7. k=getPrime(16)
  8. gift=pow(e+114514+p**k,0x10001,p)
  9. c=pow(m,e,n)
  10. print(f'p={p}')
  11. print(f'q={q}')
  12. print(f'c={c}')
  13. print(f'gift={gift}')
  14. """
  15. p=14213355454944773291
  16. q=61843562051620700386348551175371930486064978441159200765618339743764001033297
  17. c=105002138722466946495936638656038214000043475751639025085255113965088749272461906892586616250264922348192496597986452786281151156436229574065193965422841
  18. gift=9751789326354522940
  19. """
复制代码
midRSA revenge

题目描述:兔兔梦到自己变成了帕鲁被crumbling抓去打黑工,醒来后连夜偷走了部分flag
  1. from Crypto.Util.number import *
  2. import gmpy2
  3. p=14213355454944773291
  4. q=61843562051620700386348551175371930486064978441159200765618339743764001033297
  5. c=105002138722466946495936638656038214000043475751639025085255113965088749272461906892586616250264922348192496597986452786281151156436229574065193965422841
  6. gift=9751789326354522940
  7. n = p**4*q
  8. d = gmpy2.invert(65537,p-1)
  9. mm = pow(gift,d,p)
  10. e = mm - 114514
  11. print(e)
  12. #73561
  13. phi = p**3*(p-1)*(q-1)
  14. #print(gmpy2.gcd(e,phi))
  15. #73561
  16. res = Zmod(n)(c).nth_root(e, all=True)
  17. for m in res:
  18.     flag = long_to_bytes(int(m))
  19.     if b"hgame" in flag:
  20.         print(flag)
  21.         break
  22. #hgame{Ad1eman_Mand3r_Mi11er_M3th0d}
复制代码
 我的解答:
直接用上一题的脚本就行。
exp:
  1. from Crypto.Util.number import *
  2. from secret import flag
  3. m=bytes_to_long(flag)
  4. p=getPrime(1024)
  5. q=getPrime(1024)
  6. e=5
  7. n=p*q
  8. c=pow(m,e,n)
  9. m0=m>>128
  10. print(f'n={n}')
  11. print(f'c={c}')
  12. print(f'm0={m0}')
  13. """
  14. n=27814334728135671995890378154778822687713875269624843122353458059697288888640572922486287556431241786461159513236128914176680497775619694684903498070577307810263677280294114135929708745988406963307279767028969515305895207028282193547356414827419008393701158467818535109517213088920890236300281646288761697842280633285355376389468360033584102258243058885174812018295460196515483819254913183079496947309574392848378504246991546781252139861876509894476420525317251695953355755164789878602945615879965709871975770823484418665634050103852564819575756950047691205355599004786541600213204423145854859214897431430282333052121
  15. c=456221314115867088638207203034494636244706611111621723577848729096069230067958132663018625661447131501758684502639383208332844681939698124459188571813527149772292464139530736717619741704945926075632064072125361516435631121845753186559297993355270779818057702973783391589851159114029310296551701456748698914231344835187917559305440269560613326893204748127999254902102919605370363889581136724164096879573173870280806620454087466970358998654736755257023225078147018537101
  16. m0=9999900281003357773420310681169330823266532533803905637
  17. """
复制代码
我的解答:
参考:lazzzaro神yyds
exp:
  1. from Crypto.Util.number import long_to_bytes
  2. n=27814334728135671995890378154778822687713875269624843122353458059697288888640572922486287556431241786461159513236128914176680497775619694684903498070577307810263677280294114135929708745988406963307279767028969515305895207028282193547356414827419008393701158467818535109517213088920890236300281646288761697842280633285355376389468360033584102258243058885174812018295460196515483819254913183079496947309574392848378504246991546781252139861876509894476420525317251695953355755164789878602945615879965709871975770823484418665634050103852564819575756950047691205355599004786541600213204423145854859214897431430282333052121
  3. c=456221314115867088638207203034494636244706611111621723577848729096069230067958132663018625661447131501758684502639383208332844681939698124459188571813527149772292464139530736717619741704945926075632064072125361516435631121845753186559297993355270779818057702973783391589851159114029310296551701456748698914231344835187917559305440269560613326893204748127999254902102919605370363889581136724164096879573173870280806620454087466970358998654736755257023225078147018537101
  4. m_high=9999900281003357773420310681169330823266532533803905637
  5. m_high <<= 128
  6. e = 5
  7. R.<x> = PolynomialRing(Zmod(n))
  8. m = m_high + x
  9. f = m^e - c
  10. f = f.monic()
  11. x = f.small_roots(X = 2^128,beta = 0.4)
  12. if x:
  13.     m = m_high + x[0]
  14.     print(long_to_bytes(int(m)))
  15.     #hgame{c0ppr3smith_St3re0typed_m3ssag3s}
复制代码
 二进制解码 100001001000111000110010100010101011010000101111 无果,逆一下试试
  1. from Crypto.Util.number import *
  2. import random
  3. import hashlib
  4. a=[getPrime(96) for _ in range(48)]
  5. p=random.getrandbits(48)
  6. assert len(bin(p)[2:])==48
  7. flag='hgame{'+hashlib.sha256(str(p).encode()).hexdigest()+'}'
  8. bag=0
  9. for i in a:
  10.     temp=p%2
  11.     bag+=temp*i
  12.     p=p>>1
  13. print(f'a={a}')
  14. print(f'bag={bag}')
  15. """
  16. a=[74763079510261699126345525979, 51725049470068950810478487507, 47190309269514609005045330671, 64955989640650139818348214927, 68559937238623623619114065917, 72311339170112185401496867001, 70817336064254781640273354039, 70538108826539785774361605309, 43782530942481865621293381023, 58234328186578036291057066237, 68808271265478858570126916949, 61660200470938153836045483887, 63270726981851544620359231307, 42904776486697691669639929229, 41545637201787531637427603339, 74012839055649891397172870891, 56943794795641260674953676827, 51737391902187759188078687453, 49264368999561659986182883907, 60044221237387104054597861973, 63847046350260520761043687817, 62128146699582180779013983561, 65109313423212852647930299981, 66825635869831731092684039351, 67763265147791272083780752327, 61167844083999179669702601647, 55116015927868756859007961943, 52344488518055672082280377551, 52375877891942312320031803919, 69659035941564119291640404791, 52563282085178646767814382889, 56810627312286420494109192029, 49755877799006889063882566549, 43858901672451756754474845193, 67923743615154983291145624523, 51689455514728547423995162637, 67480131151707155672527583321, 59396212248330580072184648071, 63410528875220489799475249207, 48011409288550880229280578149, 62561969260391132956818285937, 44826158664283779410330615971, 70446218759976239947751162051, 56509847379836600033501942537, 50154287971179831355068443153, 49060507116095861174971467149, 54236848294299624632160521071, 64186626428974976108467196869]
  17. bag=1202548196826013899006527314947
  18. """
复制代码
 也无果,考虑到进制转换:
二进制数为:0b111101000010110101010001010011000111000100100001
转换为十进制为:268475474669857
转换为八进制为:0o7502652123070441
转换为十六进制为:0xf42d514c7121
  1. from sage.all import *
  2. a =  [74763079510261699126345525979, 51725049470068950810478487507, 47190309269514609005045330671, 64955989640650139818348214927, 68559937238623623619114065917, 72311339170112185401496867001, 70817336064254781640273354039, 70538108826539785774361605309, 43782530942481865621293381023, 58234328186578036291057066237, 68808271265478858570126916949, 61660200470938153836045483887, 63270726981851544620359231307, 42904776486697691669639929229, 41545637201787531637427603339, 74012839055649891397172870891, 56943794795641260674953676827, 51737391902187759188078687453, 49264368999561659986182883907, 60044221237387104054597861973, 63847046350260520761043687817, 62128146699582180779013983561, 65109313423212852647930299981, 66825635869831731092684039351, 67763265147791272083780752327, 61167844083999179669702601647, 55116015927868756859007961943, 52344488518055672082280377551, 52375877891942312320031803919, 69659035941564119291640404791, 52563282085178646767814382889, 56810627312286420494109192029, 49755877799006889063882566549, 43858901672451756754474845193, 67923743615154983291145624523, 51689455514728547423995162637, 67480131151707155672527583321, 59396212248330580072184648071, 63410528875220489799475249207, 48011409288550880229280578149, 62561969260391132956818285937, 44826158664283779410330615971, 70446218759976239947751162051, 56509847379836600033501942537, 50154287971179831355068443153, 49060507116095861174971467149, 54236848294299624632160521071, 64186626428974976108467196869]
  3. bag =  1202548196826013899006527314947
  4. print(bag)
  5. print(len(a))
  6. n = len(a)
  7. # Sanity check for application of low density attack
  8. d = n / log(max(a), 2)
  9. print(CDF(d))
  10. assert CDF(d) < 0.9408
  11. M = Matrix.identity(n) * 2
  12. last_row = [1 for x in a]
  13. M_last_row = Matrix(ZZ, 1, len(last_row), last_row)
  14. last_col = a
  15. last_col.append(bag)
  16. M_last_col = Matrix(ZZ, len(last_col), 1, last_col)
  17. M = M.stack(M_last_row)
  18. M = M.augment(M_last_col)
  19. X = M.BKZ()
  20. sol = []
  21. for i in range(n + 1):
  22.     testrow = X.row(i).list()[:-1]
  23.     if set(testrow).issubset([-1, 1]):
  24.         for v in testrow:
  25.             if v == 1:
  26.                 sol.append(0)
  27.             elif v == -1:
  28.                 sol.append(1)
  29.         break
  30. s = sol
  31. print(s)
  32. #输出结果
  33. 1202548196826013899006527314947
  34. 48
  35. 0.5004362519031288
  36. [1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1]
复制代码
MISC

ek1ng_want_girlfriend

An introducation to Wireshark and also ek1ng.提示1尝试用Wireshark从HTTP流量中提取文件我的解答:题目说的很明显,一个简单的http提取文件签到题Wireshark打开流量包搜索http然后导出对象即可(发现有一个图片)得到图片hgame{ek1ng_want_girlfriend_qq_761042182}ezWord

通过破译图片的水印来解开文档里的秘密吧!

我的解答:
打开附件是一个文档,里面信息如上图
说文件的内部有你想要的flag?结合题目描述试试盲水印
单图盲水印居然不行。。好好好,那我就分离word文档看看有什么
分离之后可在文件夹word --> media里面发现如下信息

恭喜.txt里面说:恭喜你找到了这些东西,现在你离flag只差解开这个新的压缩包,然后对压缩包里的东西进行两层解密就能获得flag了。压缩包的密码和我放在这的两张图片有关。
很明显双图盲水印得到压缩包密码

解压时发现压缩包有提示:
你好,很高兴你看到了这个压缩包。请注意:这个压缩包的密码有11位数而且包含大写字母小写字母和数字。还有一个要注意的是,里面的这一堆英文decode之后看上去是一堆中文乱码实际上这是正常现象,如果看到它们那么你就离成功只差一步了。
先不管这个提示我们先试试盲水印出来的密码能不能解压(尝试发现可以)
解压得到:
查看代码
  1. s = '100001001000111000110010100010101011010000101111'
  2. print(s[::-1])
  3. #111101000010110101010001010011000111000100100001
复制代码
使用工具:https://spammimic.com/decode.cgi 解码得到压缩包提示所说的中文乱码
籱籰籪籶籮粄簹籴籨粂籸籾籨籼簹籵籿籮籨籪籵簺籨籽籱簼籨籼籮籬类簼籽粆
最后rot8000解码

龙之舞

题目
新年快要到了,来看看龙年的龙之舞吧(~ ̄▽ ̄)~请注意,拿到正确的二维码后解码就是flag 但是一开始未必正确
一个wav文件
我的解答:
查看wav文件名字知道应该是使用deepsound,打开文件后要求输入密码

频谱图发现密码 5H8w1nlWCX3hQLG

分离出一个压缩包,解压是个gif,GIF分离可找到二维码部分内容如下:
054.png

120.png

152.png

231.png

把二维码拼接起来 https://merri.cx/qrazybox/ 扫描发现扫不出来。。
修改一下掩码到M4得到flag

hgame{drag0n_1s_d4nc1ng}
 
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表