SWPU NSS 2022 秋季招新赛 Crypto 出题人笔记

观前提醒

别骂了师傅们,实验室被学校 gank 了,缺了部分题目 Writeup,会在稍晚发出来,这个 Writeup 里面有图片是炸的是因为出题人用的图床的锅,别骂了呜呜呜,再给点时间

善哉善哉

@Aurorapj

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

考点:莫斯、佛曰

套娃达咩

Shoot by Aurorapj

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

image-20221021163921518

一看 莫斯! 马上在线工具

image-20221021164032704

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

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

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

image-20221021164243033
image-20221021164251891

得到:

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

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

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

image-20221021164413115

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

NSSCTF{7551772a99379ed0ae6015a470c1e335}

什锦

@MuFeng

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

考点:猪圈密码、社会核心价值观加密、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}

小明文

@MuFeng

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

考点: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分解

@MuFeng

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

考点: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

@MuFeng

看着好像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

@MuFeng

一个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}

DiscreteDiscrete

@m1nus

Discrete,题目名字上提示也很明显啦,就是离散对数的问题,题目描述我给的"Do I look like RSA?",是希望大家去了解离散对数问题和RSA的区别

题目附件

import libnum
import random
from Crypto.Util.number import *
flag = "*************************"
m = int(hex(libnum.s2n(flag)) , 16)
n = 2 ** 512
print(f"n = {n}")
x = random.randint(2, n-1) | 1
print(f"x = {x}")
c = pow(x , m , n)
print(f"c = {c}")

# n = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
# x = 9795065994886226384204904966849239623474055462495495755216573935495433269421238891934740481621010281153676351284936882958509364458306524174275663183354347
# c = 12124630419477800996787439916074125902945359931344392715324003381817849996550355767138542576383623513820157574593640624060741986552381770011023574637567067

关键就在于c = pow(x , m , n),也就是$x^m \equiv c \mod n$,这里的m也就是明文flag,可以发现m是在指数的位置上

使用sympy的discrete_log方法,discrete_log(n,c,x),三个参数分别是模数,余数,底数,拿到m

import libnum
import sympy
n = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
x = 9795065994886226384204904966849239623474055462495495755216573935495433269421238891934740481621010281153676351284936882958509364458306524174275663183354347
c = 12124630419477800996787439916074125902945359931344392715324003381817849996550355767138542576383623513820157574593640624060741986552381770011023574637567067
m = sympy.discrete_log(n, c, x)
print(libnum.n2s(m))
#NSSCTF{DIscReTe_diSCrEtE}
感谢观看我的博客~
SWPU NSS 2022 秋季招新赛 Crypto 出题人笔记
https://www.wd-ljt.com/post/1024/903.html
来源于问谛居,转载记得联系作者哟~
THE END
分享
二维码
海报
SWPU NSS 2022 秋季招新赛 Crypto 出题人笔记
观前提醒 别骂了师傅们,实验室被学校 gank 了,缺了部分题目 Writeup,会在稍晚发出来,这个 Writeup 里面有图片是炸的是因为出题人用的图床的锅,别骂了……
<<上一篇
下一篇>>