首页 > 其他分享 >2024MOECTF Crypto Week1

2024MOECTF Crypto Week1

时间:2024-10-22 17:44:48浏览次数:5  
标签:2024MOECTF bytes Crypto long print flag Week1 import

感觉西电的题都挺好,对我这个小白来说还是挺有收获的,知识点比较广泛灵活,还是要多做题啊,看书看得昏昏欲睡还不知道到底学了能干嘛(捂脸)

1.现代密码学入门指北
打开文件得到RSA加密脚本:

from Crypto.Util.number import bytes_to_long, getPrime 
from secret import flag 
p = getPrime(128) 
q = getPrime(128) 
n = p*q 
e = 65537
m = bytes_to_long(flag) 
c = pow(m, e, n) 
print(f"n = {n}") 
print(f"p = {p}") 
print(f"q = {q}") 
print(f"c = {c}") 
''' 
n = 40600296529065757616876034307502386207424439675894291036278463517602256790833 p = 197380555956482914197022424175976066223 
q = 205695522197318297682903544013139543071 
c = 36450632910287169149899281952743051320560762944710752155402435752196566406306 '''

这是一道考察RSA基本了解的签到题

from Crypto.Util.number import bytes_to_long, getPrime,long_to_bytes

import gmpy2

e = 65537

n = 40600296529065757616876034307502386207424439675894291036278463517602256790833

p = 197380555956482914197022424175976066223

q = 205695522197318297682903544013139543071

c = 36450632910287169149899281952743051320560762944710752155402435752196566406306

phi=(p-1)*(q-1)

d=gmpy2.invert(e,phi)

m=pow(c,d,n)

print(long_to_bytes(m))

#b'moectf{the_way_to_crypto}'

2.Signin

from Crypto.Util.number import*

from secret import flag

m = bytes_to_long(flag)

p = getPrime(1024)

q = getPrime(1024)

n = p*q

e = 65537

c = pow(m,e,n)

pq = (p-1)*(q-2)

qp = (q-1)*(p-2)

p_q = p + q

print(f"{c = }")

print(f"{pq = }")

print(f"{qp = }")

print(f"{n = }")

print(f"{p_q = }")

'''

c = 5654386228732582062836480859915557858019553457231956237167652323191768422394980061906028416785155458721240012614551996577092521454960121688179565370052222983096211611352630963027300416387011219744891121506834201808533675072141450111382372702075488292867077512403293072053681315714857246273046785264966933854754543533442866929316042885151966997466549713023923528666038905359773392516627983694351534177829247262148749867874156066768643169675380054673701641774814655290118723774060082161615682005335103074445205806731112430609256580951996554318845128022415956933291151825345962528562570998777860222407032989708801549746

pq = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687154230787854196153067547938936776488741864214499155892870610823979739278296501074632962069426593691194105670021035337609896886690049677222778251559566664735419100459953672218523709852732976706321086266274840999100037702428847290063111455101343033924136386513077951516363739936487970952511422443500922412450462

qp = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687077087914198877794354459669808240133383828356379423767736753506794441545506312066344576298453957064590180141648690226266236642320508613544047037110363523129966437840660693885863331837516125853621802358973786440314619135781324447765480391038912783714312479080029167695447650048419230865326299964671353746764860

n = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687534959910892789661065614807265825078942931717855566686073463382398417205648946713373617006449901977718981043020664616841303517708207413215548110294271101267236070252015782044263961319221848136717220979435486850254298686692230935985442120369913666939804135884857831857184001072678312992442792825575636200505903

p_q = 279533706577501791569740668595544511920056954944184570513187478007551195831693428589898548339751066551225424790534556602157835468618845221423643972870671556362200734472399328046960316064864571163851111207448753697980178391430044714097464866523838747053135392202848167518870720149808055682621080992998747265496

'''

主要求出p和q即可

from Crypto.Util.number import*

import gmpy2

e = 65537

'''

pq = (p-1)*(q-2)#pq-2p-q+2

qp = (q-1)*(p-2)#pq-2q-p+2

p_q = p + q

'''

c = 5654386228732582062836480859915557858019553457231956237167652323191768422394980061906028416785155458721240012614551996577092521454960121688179565370052222983096211611352630963027300416387011219744891121506834201808533675072141450111382372702075488292867077512403293072053681315714857246273046785264966933854754543533442866929316042885151966997466549713023923528666038905359773392516627983694351534177829247262148749867874156066768643169675380054673701641774814655290118723774060082161615682005335103074445205806731112430609256580951996554318845128022415956933291151825345962528562570998777860222407032989708801549746

pq = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687154230787854196153067547938936776488741864214499155892870610823979739278296501074632962069426593691194105670021035337609896886690049677222778251559566664735419100459953672218523709852732976706321086266274840999100037702428847290063111455101343033924136386513077951516363739936487970952511422443500922412450462

qp = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687077087914198877794354459669808240133383828356379423767736753506794441545506312066344576298453957064590180141648690226266236642320508613544047037110363523129966437840660693885863331837516125853621802358973786440314619135781324447765480391038912783714312479080029167695447650048419230865326299964671353746764860

n = 18047017539289114275195019384090026530425758236625347121394903879980914618669633902668100353788910470141976640337675700570573127020693081175961988571621759711122062452192526924744760561788625702044632350319245961013430665853071569777307047934247268954386678746085438134169871118814865536503043639618655569687534959910892789661065614807265825078942931717855566686073463382398417205648946713373617006449901977718981043020664616841303517708207413215548110294271101267236070252015782044263961319221848136717220979435486850254298686692230935985442120369913666939804135884857831857184001072678312992442792825575636200505903

p_q = 279533706577501791569740668595544511920056954944184570513187478007551195831693428589898548339751066551225424790534556602157835468618845221423643972870671556362200734472399328046960316064864571163851111207448753697980178391430044714097464866523838747053135392202848167518870720149808055682621080992998747265496

#pq-qp=2q+p-2p-q=q-p

q=(pq-qp+p_q)//2

p=(p_q-pq+qp)//2

phi=(p-1)*(q-1)

d=gmpy2.invert(e,phi)

m=pow(c,d,n)

print(long_to_bytes(m))

#b'moectf{Just_4_signin_ch4ll3ng3_for_y0u}'

3.ez_hash

from hashlib import sha256

from secret import flag, secrets

assert flag == b'moectf{' + secrets + b'}'

assert secrets[:4] == b'2100' and len(secrets) == 10

hash_value = sha256(secrets).hexdigest()

print(f"{hash_value = }")

# hash_value = '3a5137149f705e4da1bf6742e62c018e3f7a1784ceebcb0030656a2b42f50b6a'

可以看出这要求我们进行爆破secrets并使其sha256加密后hash_value等于给定值

import itertools

import hashlib

from Crypto.Util.number import long_to_bytes

key = '2100'

dir = '1234567890'

dir_list = itertools.product(dir, repeat=6)

for i in dir_list:

        data=i[0]+i[1]+i[2]+i[3]+i[4]+i[5]

        secrets=hashlib.sha256((key+data).encode('utf-8')).hexdigest()
        if(secrets=='3a5137149f705e4da1bf6742e62c018e3f7a1784ceebcb0030656a2b42f50b6a'):

            m=key+data

            flag='moectf{'+m+'}'

            print(flag)

可以直接在2100后面遍历六位数转换,str(i)即可。
但用字典可以解出带字母的flag,但其实还是用工具最快!(工具小子上线)
hashcat可以几分钟内爆出特殊字符加数字字母等组合,实在强大!

4.Big and small

from secret import flag

from Crypto.Util.number import*

m = long_to_bytes(flag)

p = getPrime(1024)

q = getPrime(1024)

n = p*q

e = 3

c = pow(m,e,n)

'''

c = 150409620528288093947185249913242033500530715593845912018225648212915478065982806112747164334970339684262757

e = 3

n = 20279309983698966932589436610174513524888616098014944133902125993694471293062261713076591251054086174169670848598415548609375570643330808663804049384020949389856831520202461767497906977295453545771698220639545101966866003886108320987081153619862170206953817850993602202650467676163476075276351519648193219850062278314841385459627485588891326899019745457679891867632849975694274064320723175687748633644074614068978098629566677125696150343248924059801632081514235975357906763251498042129457546586971828204136347260818828746304688911632041538714834683709493303900837361850396599138626509382069186433843547745480160634787

'''

这是考察低密度加密指数攻击。可以发现e极小,能直接解出m

from Crypto.Util.number import*

import gmpy2

c = 150409620528288093947185249913242033500530715593845912018225648212915478065982806112747164334970339684262757

e = 3

n = 20279309983698966932589436610174513524888616098014944133902125993694471293062261713076591251054086174169670848598415548609375570643330808663804049384020949389856831520202461767497906977295453545771698220639545101966866003886108320987081153619862170206953817850993602202650467676163476075276351519648193219850062278314841385459627485588891326899019745457679891867632849975694274064320723175687748633644074614068978098629566677125696150343248924059801632081514235975357906763251498042129457546586971828204136347260818828746304688911632041538714834683709493303900837361850396599138626509382069186433843547745480160634787

m=gmpy2.iroot(c,e)[0]

print(long_to_bytes(m))

#flag{xt>is>s>b}

5.baby_equation

from Crypto.Util.number import *

from secret import flag

l = len(flag)

m1, m2 = flag[:l//2], flag[l//2:]

a = bytes_to_long(m1)

b = bytes_to_long(m2)

k = 0x2227e398fc6ffcf5159863a345df85ba50d6845f8c06747769fee78f598e7cb1bcf875fb9e5a69ddd39da950f21cb49581c3487c29b7c61da0f584c32ea21ce1edda7f09a6e4c3ae3b4c8c12002bb2dfd0951037d3773a216e209900e51c7d78a0066aa9a387b068acbd4fb3168e915f306ba40

assert ((a**2 + 1)*(b**2 + 1) - 2*(a - b)*(a*b - 1)) == 4*(k + a*b)

首先把k转为十进制,然后看看这个等式,考察我们因式分解。
使用factor分解k发现k是平方数,联系上系数4,这启发我们因式分解的结果应当为完全平方式。
再观察(问ai)可知因式为

\[((a+1)(b-1))^2=4k \]

然后问题就来了,k的平方根有18个质因数相乘,也就是要我们去爆破a,使结果包含flag头
这里的想法就是通过0和1代表选不选这个质因数,可以考虑深度搜索,但直接生成18位二进制数即可

from Crypto.Util.number import *
k = 0x2227e398fc6ffcf5159863a345df85ba50d6845f8c06747769fee78f598e7cb1bcf875fb9e5a69ddd39da950f21cb49581c3487c29b7c61da0f584c32ea21ce1edda7f09a6e4c3ae3b4c8c12002bb2dfd0951037d3773a216e209900e51c7d78a0066aa9a387b068acbd4fb3168e915f306ba40

#assert ((a**2 + 1)*(b**2 + 1) - 2*(a - b)*(a*b - 1)) == 4*(k + a*b)

k=18920852552199568683862603789419838424348825344067007879518970244220995484061667491970278474013100464859199853038080061030237584353267635736241717581184802483498340171648257147974686295671666944002207188344325035425563660274699853645608765766139772741953948277222000015673047616

n=4349810634062081636800140028784532821535759239248117454389983291832454302278635954133886929853413914450692706075907398009224277656450630296

factors = [2, 2, 2, 2,3, 3, 31, 61, 223, 4013, 281317, 4151351, 339386329, 370523737,5404604441993,26798471753993,25866088332911027256931479223,64889106213996537255229963986303510188999911]

#(a+1)*(b-1)=2*n

for i in range(2**len(factors)):

    t=bin(i)[2:].zfill(len(factors))
    a_=1

    for j in range(len(factors)):

        if(int(t[j])):
            a_*=factors[j]

    a=a_-1
    b_=2*n//a_
    b=b_+1
    a=long_to_bytes(a)

    if b'moectf{' in a:

        b=long_to_bytes(b)
        print(a+b)
        break
#moectf{7he_Fund4m3nt4l_th30r3m_0f_4rithm3tic_i5_p0w4rful!}

事实上如果不break,我们会发现i有12中序列可以满足
因为a其实是4和3的倍数,意味着从4个2挑2个2,从2个3二选一即

\[{ 4 \choose 2 }{2\choose 1}={C_4}^{2}{C_2}^{1}=12 \]

标签:2024MOECTF,bytes,Crypto,long,print,flag,Week1,import
From: https://www.cnblogs.com/tinglv/p/18493395

相关文章

  • 0xGame2024-week2-crypto
    CryptoLFSR-babyfromrandomimportgetrandbitsfromsecretimportflag,seedfromhashlibimportmd5defMD5(m):returnmd5(str(m).encode()).hexdigest()classLFSR: def__init__(self,seed,Length): self.Length=Length assertseed.bit_length()<......
  • NewStar2024-week2-Crypto
    Crypto茶里茶气fromCrypto.Util.numberimport*flag="flag{*****}"assertlen(flag)==25a=""foriinflag:a+=hex(ord(i))[2:]l=int(a,16).bit_length()print("l=",l)v0=int(a,16)>>(l//2)v1=int(......
  • Moectf2024-All-Crypto
    前三周都出了,第四周有两题不会,为复现Crypto入门指北fromCrypto.Util.numberimportbytes_to_long,getPrimefromsecretimportflagp=getPrime(128)q=getPrime(128)n=p*qe=65537m=bytes_to_long(flag)c=pow(m,e,n)print(f"n={n}")print(f"p={p......
  • 0xGame2024-week1-crypto
    CryptoCaesarCipher密文:0yHbnf{Uif_Cfhjoojoh_Pg_Dszqup}提示:凯撒加密。改成-1就好了RSA_EasyfromCrypto.Util.numberimportbytes_to_long,getPrimefromhashlibimportmd5fromrandomimportrandintfromgmpy2importinvert,gcd#HashFunction:defMD5(m......
  • ossfs挂载OSS对象存储时出现libcrypto版本问题
    问题:在容器内使用ossfs挂载OSS对象存储,安装和配置都按照官方教程很顺利,但是挂载的时候出现了问题,libcrpyto1.0.0动态库缺失。原来是下载错了安装包,官网有Ubuntu22.04的安装包,所以该问题不存在,下述内容仅提供类似问题的思路。!!!但是遇到了容器内挂载OSS的另一个问题,需要访问FUSE文......
  • crit: Microsoft.AspNetCore.Server.Kestrel[0] Unable to start Kestrel. Interop+Cr
    域名证书没有放在指定的位置错误信息crit:Microsoft.AspNetCore.Server.Kestrel[0]UnabletostartKestrel.Interop+Crypto+OpenSslCryptographicException:error:2006D080:BIOroutines:BIO_new_file:nosuchfileatInterop.Crypto.CheckValidOpenSslHandle(Saf......
  • android开发编译openssl源代码生成libcrypto.so和libssl.so两个动态库用于android ndk
    openssl编译本篇文章的操作是在Linux环境之下,在虚拟机ubuntu20版本上操作的步骤1.openssl下载解压tar包openssl下载地址:https://openssl-library.org/source/下载完解压:tar-zxvfopenssl-3.3.2.tar.gz//我这里下载openssl-3.3.2.tar.gz版本2.编译openssl库,得......
  • shctf [week1]poppopop
    最近刚好在学pop链和反序列化,那就写一篇shctf做题的随笔吧进来先审计代码;1.发现反序列化首先会调用__destruct()魔术方法,将$Web赋为true,并echo$n,显然在这里我们得再有一个魔术方法,又因为这里调用的n被当字符串输出,一眼看到__toString(),考虑把$n赋值为newF();2.F类中$o被当作......
  • NewStar CTF 2024 week1 题解
    1.base题目给了以下内容:Thisisabasequestion!4C4A575851324332474E324547554B494A5A4446513653434E564D444154545A4B354D45454D434E4959345536544B474D5134513D3D3D3D观察给出的字符串发现,字符串由数字0-9以及字母A-F组成,于是推测这可能是一个base16编码,于是将其解码,......
  • BaseCTF复现-Crypto
    前言base打了没几天就军训了,前两周的还打了打,军训烤红薯了,后面上的题都懒得看了,趁着国庆假期,闪击了下苏州,人太多了,还不如待在学校水一水。因为是复现平台做的,顺序比较乱。铜匠附件:​fromCrypto.Util.numberimportgetPrime,bytes_to_long#fromsecretimportflagflag=......