【NSSCTF2022招新赛】 Crypto部分题目Write Up

发布于 2022-10-21  31 次阅读


NSSCTF2022招新赛

Crypto

善哉善哉

善斋善哉,出题人以慈悲为怀

考点:莫斯、佛曰

套娃达咩

Shoot by Aurorapj

发现没什么特别,拖进Winhex 看看,发现最后面有点东西

image-20221021163921518

一看 莫斯! 马上在线工具

image-20221021164032704

发现新佛曰,继续在线工具

新佛曰:諸隸僧降閦吽諸閦陀摩隸僧缽薩閦嚤降斯咤須閦色嘚嘇叻閦夷喃哆嚴吶菩若嘇耨咒閦愍閦囉耨所嚤閦嘇閦降陀叻羅宣吽眾阿愍菩修心降叻陀嚤吽蜜吶斯閦嘚愍吽若宣哆色塞囉伏嘇愍降嘇吽闍兜喼如

这里有点脑洞,不过仔细看应该能看出来上面有变化。

image-20221021164243033

image-20221021164251891

得到:

施主,此次前来,不知有何贵干?

但是直接拿去提交Flag发现错误,继续在文件里找线索。

最终在属性-备注中发现线索,需要对佛说的内容进行MD5加密

image-20221021164413115

此处省略MD5加密过程,直接贴flag了

NSSCTF{7551772a99379ed0ae6015a470c1e335}

什锦

猪猪这么这么可爱,怎么可以吃猪猪呢!——奇奇怪怪的密码

考点:猪圈密码、社会核心价值观加密、Brainfuck

CodeA=Decode(友善爱国平等友善自由友善敬业爱国诚信文明诚信自由平等友善平等友善公正诚信民主友善自由友善爱国公正敬业爱国爱国诚信自由友善爱国自由诚信民主爱国诚信民主友善平等友善爱国公正敬业公正爱国法治友善爱国公正敬业爱国爱国诚信自由诚信自由平等敬业文明爱国诚信文明诚信自由爱国诚信民主富强敬业富强)
CodeB=Decode(CodeB.png)
CodeC=Decode(CodeC.txt)
flag=MD5(CodeA+CodeB+CodeC)

CodeA一看就是社会主义核心价值观加密 在线工具 解得

富强明主文明和谐

CodeB 一只猪 还有一堆菜~斯哈~ 饿了,呜呜呜

image-20221021165003859

联系题目描述,是猪圈密码 在线工具 解得

pigissocutewhyyoukillpig

注意:此处是小写 且字母与字母之间无空格

CodeC:打开满屏的加号,后面发现有大于号等,用工具解,加密方式是Brainfuck,这边有点问题,很多在线工具无法解出中文结果

但是猪猪好好吃诶

合并ABC得

富强明主文明和谐pigissocutewhyyoukillpig但是猪猪好好吃诶

进行MD5加密并用NSSCTF包裹,得到flag

NSSCTF{c05485d678cb8a6beb401f31d762532a}

小明文

为什么这道题看着好眼熟,但我确不会做

考点:RSA小明文攻击

from gmpy2 import invert
from Crypto.Util.number import getPrime, bytes_to_long
from flag import getflag

e = 3
p = getPrime(1024)
q = getPrime(1024)
n = p * q
phiN = (p - 1) * (q - 1)
d = invert(e, phiN)
m = bytes_to_long(getflag().encode())
c = pow(m, e, n)
print("c=" + str(c))
#c=128198926274489803523728445192921664
#flag=NSSCTF{c}

一看,是一道RSA题目,但是只给了C,并且联系题目名和e=3,应该是小明文攻击

原理:当e=3时 flag也较小时,m的e次方远远小于n,所以c就是m的e次方,c、e已知,求m,直接开e次方

脚本:

import math
from Crypto.Util.number import long_to_bytes
a=128198926274489803523728445192921664
print(long_to_bytes(math.ceil(a ** (1 / 3))))

将输出结果用NSSCTF{}包裹,得到flag

NSSCTF{ufind}

Yafu分解

我题出错了吗?为什么查不到?

考点:RSA大数分解-yafu

from gmpy2 import invert
from Crypto.Util.number import getPrime, bytes_to_long
from flag import getflag

e = 65537
p = getPrime(140)
q = getPrime(140)
n = p * q
phiN = (p - 1) * (q - 1)
d = invert(e, phiN)
m = bytes_to_long(getflag().encode())
c = pow(m, e, n)
print("n=" + str(n))
print("c=" + str(c))
#n=1851012829537540993346897265450988006921329733937556249710137670254755668838970157221
#c=1165608868963663237838494928147497339359377331987999335624507621030816298293537918937

这同样是一道RSA的题,发现给了e、n、c,但是解的话需要d,想要d的要phiN,然后得到pq,尝试去分解n,发现在线工具无法分解,用yafu工具本地跑试试吧。

image-20221021171212461

成功解出pq

现在就是模板了,随便搜一个RSA解密脚本,修改对应的值,直接出flag

脚本:

from Crypto.Util.number import long_to_bytes
from gmpy2 import invert

c = 1165608868963663237838494928147497339359377331987999335624507621030816298293537918937
p = 1358730637766188714476624560503309609820513
q = 1362310363870711901033415700690289289304517
e = 65537
n = p * q
phiN = (p - 1) * (q - 1)
d = invert(e, phiN)
print(long_to_bytes(pow(c, d, n)))

得到:AFFPGS{snzv1l_ov9_gur_g0_Jr1p0zr}

用rot13解密,得到flag

NSSCTF{fami1y_bi9_the_t0_We1c0me}

AES

看着好像Base,但是又不是,他是什么呢

考点:AES基础

题目:

import base64
from Crypto.Cipher import AES
from flag import getflag
iv = '1229002635654321'
key = 'nssctfneedcrypto'
data = getflag()

def pad(data):
    pad_data = data
    for i in range(0, 16 - len(data)):
        pad_data = pad_data + ' '
    return pad_data

def AES_en(key, data):
    if len(data) < 16:
        data = pad(data)
    AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
    AES_en_str = AES_obj.encrypt(data.encode("utf-8"))
    AES_en_str = base64.b64encode(AES_en_str)
    AES_en_str = AES_en_str.decode("utf-8")
    return AES_en_str

data = AES_en(key, data)
print(data)
#data=862EoKZMO3sqpNlzyvIW5G/8MFeAI/zgGXcgi5eNOL8=

题目名已经给完提示了,AES加密了,我比较懒,这个题我搜了个脚本,然后把解密部分直接删了,百度这道题的部分代码,应该是可以找到完整代码的。

脚本:

import base64
from Crypto.Cipher import AES

iv = '1229002635654321'
key = 'nssctfneedcrypto'
data = '862EoKZMO3sqpNlzyvIW5G/8MFeAI/zgGXcgi5eNOL8='


# 将原始的明文用空格填充到16字节
def pad(data):
    pad_data = data
    for i in range(0, 16 - len(data)):
        pad_data = pad_data + ' '
    return pad_data


def AES_de(key, data):
    data = data.encode("utf-8")
    data = base64.b64decode(data)
    AES_de_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
    AES_de_str = AES_de_obj.decrypt(data)
    AES_de_str = AES_de_str.strip()
    AES_de_str = AES_de_str.decode("utf-8")
    return AES_de_str


data = AES_de(key, data)
print(data)

直接跑出flag了

NSSCTF{NSS_CRYPTO_NEED_YOU_0000}

爆破MD5

一个Crypto手需要会使用Python喔!

考点:Python爆破MD5

data='Boom_MD5****'
flag=MD5(data)
print(flag)
#0618ac93d4631df725bceea74d0*****

其实,这道题是拿来凑数的,不到一分钟就出好了

没想到居然难度这么大^_^

意思就是 data的md5等于后面那串注释掉的,差4位

直接爆破吧,反正也不多

脚本:

import hashlib
dic = ['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'P', 'L', 'Z', 'X', 'C','V', 'B', 'N', 'M', '_']
for a in range(len(dic)):
    for b in range(len(dic)):
        for c in range(len(dic)):
            for d in range(len(dic)):
                m = 'Boom_MD5' + dic[a] + dic[b] + dic[c] + dic[d]
                flag = hashlib.md5()
                flag.update(m.encode())
                md5 = flag.hexdigest()
                print(m)
                if md5[0:8] == '0618ac93':
                    print(md5)
                    quit()

跑出后用NSSCTF包裹,得到flag

NSSCTF{0618ac93d4631df725bceea74d0fe071}