CNSS招新题-2021-crypto-writeup
CNSS招新题-crypto-writeup
Ccc
[😋] 大大超人的代码 I
先贴代码
1 | from Crypto.Util.number import long_to_bytes |
求逆,利用扩展欧几里得算法求解即可
1 | from Crypto.Util.number import long_to_bytes |
得到flag
1 | cnss{you yi ge ren qian lai mai gua. lue lue lue lue lue. sa ri lang, sa ri lang. ei, hua qiang, hua qiang} |
[😋] 大大超人的代码 II
先贴代码
1 | from hashlib import md5 |
求 $1$ 到 $num-1$ 中与 $num$ 互素的元素的和,也就是求 $num$ 的欧拉函数值,将 $num$ 质因数分解后利用公式求解即可
对 $num$ 进行质因数时 $factordb$ 不管用了,利用一下代码分解
1 | import math |
得到分解结果如下
1 | [726469, 726469, 726469, 726469, 726469, 1248059, 1248059, 1248059, 1248059, 1248059, 1248059, 3488777, 3488777, 3488777, 3488777, 3488777, 3488777, 4003333, 4003333, 4003333, 4003333, 4003333, 4003333, 4003333, 7324349, 7324349, 7324349, 7324349, 7324349, 7324349, 7324349, 7324349, 7324349, 13943177, 13943177, 13943177, 13943177, 13943177, 13943177, 14429917, 14429917, 14429917, 14429917, 14429917, 14429917, 14429917, 14429917, 14429917, 14429917, 40264613, 40264613, 40264613, 40264613, 40264613, 40264613, 40264613, 40264613, 40264613, 40264613, 117077309, 117077309, 117077309, 117077309, 117077309, 416211353, 416211353, 416211353, 416211353, 416211353, 416211353, 416211353, 416211353, 416211353, 925020799, 925020799, 925020799, 925020799, 925020799, 925020799, 925020799, 925020799, 925020799, 1291513693, 1291513693, 1291513693, 1291513693, 1291513693, 1291513693, 1291513693, 1291513693, 1291513693, 1291513693, 4297172359, 4297172359, 4297172359, 4297172359, 4297172359, 4297172359, 4297172359, 6945055903, 6945055903, 6945055903, 6945055903, 6945055903, 6945055903, 6945055903, 6945055903, 14980192757, 14980192757, 14980192757, 14980192757, 14980192757, 14980192757, 31896490931, 31896490931, 31896490931, 31896490931, 31896490931, 31896490931, 31896490931, 31896490931, 34448261957, 34448261957, 34448261957, 34448261957, 34448261957, 34448261957, 34448261957, 34448261957, 34448261957, 42273263297, 42273263297, 42273263297, 42273263297, 42273263297, 334972370143, 334972370143, 334972370143, 334972370143, 334972370143, 334972370143, 409576292549, 409576292549, 409576292549, 409576292549, 409576292549, 409576292549, 409576292549, 409576292549] |
接下来利用欧拉函数求解即可
1 | from hashlib import md5 |
得到flag
1 | cnss{7b4a23cf05fc166e2f5e6798d737cb83} |
[😋] EZRSA
代码
1 | from Crypto.Util.number import bytes_to_long,getPrime |
注意到加密指数 $e=3$ ,直接尝试对 $c+kn$ 开立方,尝试发现 $ k=0 $ 时就可以得到flag
解密代码如下
1 | from Crypto.Util.number import long_to_bytes |
得到flag:
1 | cnss{面对恐惧的最好办法就是消除恐惧} |
[😋] True Random
代码如下
1 | import random |
考察随机数种子与异或运算,利用 $seeds$ 和 $ res$ 生成完整的 $rands$ 后再异或运算即可得到flag。解密时记得把 $res$ 首位的 $0$ 加上
解密代码如下:
1 | import random |
得到flag:
1 | cnss{Trust me!This is turely random!!!!TURELY RANDOMMMMMM!!!!!} |
[😋] 基地遭到攻击
先贴代码
1 | msg = '' |
忘了怎么做了,先把解题代码放上来,后面再看
1 | def dec_to_ter(num): # 十进制转三进制(保留4位) |
运行结果:
1 | qing ji zhu n@melessoier shi zhen de qiang!!!Your flag is:cnss{This_is_a_strange_switch_of_Base} ¥ |
[(😋+😗)/2] Smooth Criminal
代码
1 | msg = b'' |
离散对数问题,题目已经暗示 $p-1$ 是一个光滑数,显然是想考察 $Pohilg_Hellman$ 算法。
直接扔进 $sage$ 求解偷一波懒。 sage yyds! (bushi
1 | h = 284807206758690260674168635652206676153199531206012399963212250117387237611215360933500261515214683228087961018802214033227875404285999805861378064908267139553648162291537289278610803697593790816897557638428568100928359466319989545031886032567685512341977270979526717345142165708163150135333252686395591140161831940144432170025393466325742577593887920556316984992847396283579269633262200726954355227038902620716137491876506054110491178240133590849734496335712064335802238492192883394892712228203054091984354156897863240197296165162563130406991577815765695750522464228829570550025932368633890216042941018677666517405480771960616480812214562091924764071878808127451559388368257581409875583275118825609722046677620382418300990385176438231226653889407671404650316193783984038250699566770765090427892884433879512806495203724706133916982135893710559405918247360707377685182171666477087313942829242876879340985182675501598869126412636 |
得到flag:
1 | cnss{You_have_got_Pohilg_Hellman!} |
[😗] ECDLP
代码:
1 | from Crypto.Util.number import bytes_to_long |
一道简单的ECDLP问题,考察 $Pohlig_Hellman$ 算法
1 | M = 93556643250795678718734474880013829509320385402690660619699653921022012489089 |
求出key后扔进IDLE转回bytes类型得到flag:
1 | cnss{S4G3&P0h1i9} |
[😗] 那个男人!!!
万恶的纯猜题/(ㄒoㄒ)/~~
先看代码
1 | from Crypto.Util.number import bytes_to_long, getPrime |
1 | nc 101.32.29.195 9999 |
首先是常规的 $proof_of_work$ ,暴力破解即可
进入系统后有两种操作可选
1 | [+] 1.Get your gift |
操作 $2$ 后发送正确的 $secret$ 就可以得到 $flag$
操作 $1$ 后系统会生成一个随机的 $num$ 代入一个 $t$ 次同余多项式进行运算得到 $result$,然后给出 $num$ 和 $result$,其中多项式的常数项就是我们要求的 $secret$
其中选择 $1$ 可以重复选择,由此可以通过不断地选择操作 $1$ 来得到 $t$ 组$num$ 和 $result$,然后构建出一个 $t$ 维的线性方程组来求解得到 $secret$
最后需要解决的问题就是这个 $t$,$len(flag)$ 未知且每次运行还会生成随机数。。。
1 | t = len(flag) * random.randint(4, 8) |
刚开始脑子抽了在手动猜,失败无数次后心态发生了亿点点变化(
后面利用python里的os包来进行自动运行,尝试到 $len(flag)=45$ 时得到flag
对于求解 $flag$,最初手写了一个模条件下的简易高斯消元来求解,得到flag后发现好像想要考察的是拉格朗日插值法
完整解题代码如下:
1 | # coding:utf-8 |
1 | import os |
flag:
1 | cnss{Lagrange_i5_one_of_My_favour1te} |
[😗] RSA I
事RSA!
1 | from Crypto.Util.number import * |
难点在于通过 $p*q$ 和 $_p\bigoplus_q$ 来分解 $p,q$
观察发现,把 $_p\bigoplus_q$ 的后256位反向后可以得到 $p\bigoplus q_f$,个人感觉应该是要利用异或限制来暴力分解 $p,q$,但是思考后没能实现算法
刚开始在CTFtime上找到一道类似的rsa题目PlaidCTF 2021 / xorsa,但是这道题中的限制条件是 $p\bigoplus q$ ,尝试类比,无果
后面单独寻找异或分解终于找到GKCTF 2021 / XOR,利用脚本分解 $p,q$ 后常规求解rsa得到flag
不过最后还是没有搞懂原理,招新结束后找个师傅问一哈
1 | from Crypto.Util.number import * |
1 | from Crypto.Util.number import long_to_bytes |
得到flag:
1 | cnss{st0_Mmons7er_Or2_ajfwiclskjd} |
[😯] RSA II
1 | n = 97814568264814384858194701955408461509880555772006698372422205341758322175891474378211599333051180365254844248340812534463000531890490435018379585036704801177155418066770861143206836558793774360498040810255823235715535487716966004194143204900564413879660115112965484824906920141847149888933004740523449213441 |
题目只给了 $n,e,c$ 三个数据,刚开始看 $e$ 的大小觉得是 $Wiener’s Attack$ 或者 $Boneh and Durfee attack$,尝试失败后陷入了迷茫,然后直接扔factordb发现分解出来了。。。超,大意了
常规解密后得到一个网址
1 | https://files.catbox.moe/eami99.py |
打开后发现套了一层啊这是
1 | from Crypto.Util.number import * |
看完代码后发现是一道 $Short_padding_attack$ 结合 $Related_message_attack$ 的题目,考察对 $Coppersmith$ 算法的使用
首先利用 $Short_padding_attack$ 求出 $padding$ ,然后代入 $padding$ 利用 $Related_message_attack$ 求解并转回bytes即可得到flag
1 | def short_pad_attack(c1, c2, e, n): |
1 | flag = bytes_to_long(59780862049663373465799351334364799719350413972042289550369773853093462961495194111494470756664785207187307066237).decode |
flag:
1 | cnss{0x10001_getPrime_invert_pow_long_to_bytes} |
[😗] 大大超人的代码Ⅲ & [😯] 大大超人的代码Ⅳ
同一道题的两个不同难度,考察的核心是下面这个函数的计算:
1 | # p is a prime number, 2 <= a,b < p |
题目翻译过来就是找到最小的 $i$ 满足:
一道纯数学题,用到的是数论中阶相关的知识,刚开始做的无比艰难,后面通过举例尝试得(cai)到了结果,但是还没能得到严谨证明
得到公式后只需要解决求阶的问题就可以了,刚开始用的是暴力遍历 $\phi(p)$ 因数的方式来求阶,但是速度太慢了,第一题足足跑了两个小时
但是第二题有时间限制,就不能再用这么暴力的方法了,后面从判断原根的算法中得到启发,通过筛选去除质因数的方法来求阶:
遍历 $\phi(p)$ 的质因数 $p_i$ ,若 $a^\frac{\phi(p)}{p_i}\not=1$ ,则 $p_i$ 不是 $ord_p(a)$ 的质因数,将 $\phi(p)$ 其从中除去,最后剩下的就是 $ord_p(a)$ . 具体代码实现如下:
1 | def find(a, lst, p): |
经测试,代码平均用时在0.01-0.02s左右,成果解决第二题
不过好像还存在一点小bug😢,因为我解决掉第二题之后用这个算法去解决第一题时最后结果不太对劲,而且跑出来的结果有时候还不一样,但是由于时间问题还没仔细找问题出在哪,后面有时间了再看一看,找师傅要证明的时候可以问一问
最后给出两道题的flag
1 | cnss{490340709191995056161967738} |
1 | cnss{ACM_L1mit5_My_Im@ginati0n} |
[👿]CNSS Crypto Service
BOSS题来辣!
1 | #!/usr/bin/env python3 |
题目有两个考察点
第一个是利用 $AES-CBC$ 翻转攻击来伪造 $token$ 登录 $admin$ ,进而获取 $flag$ 经过 $OCB2$ 加密后得到的 $nonce、cipher、tag$
第二个是 $OCB2$ 的 $Plaintext\ Recovery$ ,因为我们并不能直接利用系统的 $decrypt$ 来进行解密,所以就需要通过一系列构造来绕过限制条件进行解密
首先是 $AES-CBC$ 翻转攻击
在0CTF2017找到了一道类似的题目,大致思想就是利用 $AES-CBC$ 分组加密并且每一组的加密依靠的是上一组密文的特性来进行伪造
以 $admin$ 身份登录后取得 $nonce、cipher、tag$
接下来就要用到 $OCB2$ 的 $Plaintext\ Recovery$
最初找到了一篇论文Plaintext Recovery Attack of OCB2和一道类似的题Cryptography: Attacking OCB2 – react0r blog,看完后基本上已经有了思路,然后利用github上找到的代码成功解决
最后的解题代码有点小bug,sendline发的太快容易导致顺序错乱,还没来得及解决,暂时用调试顶替了一下。
完整代码如下:
1 | from pwn import * |
最后得到flag:
1 | cnss{0CB2_1S_N0t_S3cUR3__US3_OcB3_1NST34D!!!!!!} |