2020 网鼎杯
青龙组
boom
first:this string md5:46e5efe6165a5afb361217446a2dbd01
去在线网站查得:en5oy
This time:Here are have some formulas
3x-y+z=185
2x+3y-z=321
x+y+z=173
input: x =
1 | var('x y z') |
Last time: Kill it
x*x+x - 7943722218936282 = 0
input x:
1 | var('x') |
you raise me up
1 | #!/usr/bin/env python |
题中我们的flag在m的指数位置,所以这题是解一个DLP(离散对数问题)
发现题中的n = 2 ** 512, 所以phi(n) = 2 ** 511;即本题模数的欧拉函数具有smooth的性质,即其是由很多小素数乘积而来,所以可用Pohlig Hellman 算法来解决这个DLP,sage的discrete_log用的方法就包括Pohlig Hellman算法,exp:
1 | m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075 |
easy_ya
题目代码
1 | from secret import flag,key |
显然,我们第一步需要去交互,拿到四个大数,其中两个是有公因子p的大数n,还有两个就是ek的密文。这一步就是凑数的part,没点营养。吐槽,交互的时候什么沙雕PoW,有必要卡这个嘛
破PoW的脚本
1 | from pwn import * |
然乎我们输入token,拿到自己的data
解得ek
1 | from Crypto.Util.number import * |
python2下会得到这么个ek,有点意思嗷,但你还是沙雕出题人,谁让你用PoW卡我
python3运行得到b'\xe6\x84\xbf\xe6\x88\x91\xe6\x89\x80\xe7\x88\xb1\xe6\x97\xa0\xe5\xbf\xa7\xe6\x81\x99\xe5\xb2\x81\xe9\x95\xbf\xe5\xae\x89'
然后去掉该去的就能得到key了'\x88\x91\x89\x80\x88\xb1\x97\xa0\xbf\xa7\x81\x99\xb2\x81\x95\xbf\xae\x89'
然后就是逆这个encode了。
其中我们交互的时候拿到五组密文,易得,每组密文中,保存了encode中32轮加密后的完整的y,pads和有一部分重合。但是pads加了32次pad后,最后5位已经变成0了。所以z我们可以知道20+5 = 25位,剩下七位未知。
然后我们就去爆pad,我们从密文里头能知道pad的52-32=20位。但这20位其实是中间部分的。最高的5位已经被limit搞没掉了。然后最低的7位我们也是不知道的。所以,,,爆。我们爆了低7位的同时,也能确定一个z,然后反加密看结果咯。
exp:
1 | from Crypto.Util.number import * |
白虎组
b64
换表base64,将给出对应关系记下来,发现flag密文中[‘E’, ‘G’, ‘I’, ‘s’, ‘X’, ‘z’],这六个字符没有映射关系。
然后有[‘+’, ‘/‘, ‘1’, ‘5’, ‘7’, ‘6’, ‘9’, ‘8’, ‘A’, ‘C’, ‘H’, ‘K’, ‘J’, ‘P’, ‘R’, ‘V’, ‘e’, ‘f’, ‘n’, ‘u’, ‘w’, ‘v’] 这么多位字符也没有被映射。
所以爆破这两个列表中的映射关系
然后根据flag的格式,uuid,来判断结果。
1 | # -*- coding: utf-8-*- |
rand
啊,一道憨憨题,mt19937都快给玩烂了。而且这还是最最简单的预测,直接套上现成的工具就能解key。至于后面的一个只给了加密函数没给解密函数用的feistel的密码,可能是DES吧,没细看。直接把密钥流反过来,用他给的加密函数来解密就好了。
MT19937预测key
1 | import random |
拿到key,改加密函数,解密得到flag。
1 | # -*- coding: utf-8 -*- |
朱雀组
simple
简单仿射加密,就是123456和26不互素,我们用26的一个素因子13代替26先,得到的答案,可以选择:如果不符合uuid格式,就加个13,不过,后来想想,由于uuid只有abcdef加上 ‘flag’ 的lg,模13其实是足够的。所以其实不需要判断。
由于仿射不加密除字母外的字符,所以直接拼接上来就可以了
确实simple,解密代码就一行:
1 | from Crypto.Util.number import inverse |
RUA
rsa低加密指数攻击,直接套先知上的一个脚本,刚开始测e=3,发现失败,于是爆破e
1 | import binascii,gmpy2 |
guess_game
两个考点:LCG和LFSR
LCG攻击原理这里看,NCTF出现过的。
LFSR的攻击手法ctf-wiki上看。
解密流程:
第一步我们通过六个level的值恢复LCG的参数从而预测第七个code,从而达到(500,10)这个level。开局拥有10个coin!
然后我们用9次机会,可以得到72bit的输出,其中前40bit输出逆序可以得到初始的r
但是这里的lfsr其实是39级的,所以至少需要78bit才能恢复
所以我们要爆破6bit的输出
需要说明的是即使有78bit的输出,也有可能因为矩阵没有满秩从而解不出key来。
然后这里我换了个思路,我硬猜,要求前九次猜中一个,这样我就可以多拿两组数据(其实多拿一次就够了)
这样我就能拿到80bit的输出,然后我用下面那个sage脚本,根据wiki所述构造矩阵,解个线性方程,得到key。点解密的时候要放《好运来》,增加解密成功的概率,唱《国歌》应该也可以。
1 | output = '10100010010100010010101001100110000000000111101111011101010101000111110011111011' |
用于交互的脚本
1 | # -*- coding: utf-8 -*- |
最后五分钟出flag,太幸运了。就是没队伍,有点浪费了。
玄武组
Safe_box
主要逻辑
- 过了PoW进行交互
- 1可以得到一组23*20的key
- 3可以得到flag的密文c
- 加密函数生成23*40的key,一共23组明文,每组明文加密40次,记录每次的结果
- 每一次的加密逻辑为b = m + Σ((a_j*i)e_i),其中a_j为组里的加密次数,j=1,2,,40;e_i为列表e里的每一个元素,i = 1,2,3,,,29
解密流程
- 第一组,当i=0时,a=1,b_1 = m_1 + Σ(e_i)
- 第二组,当i=0时,a=1,b_2 = m_2 + Σ(e_i)
- 第三组,当i=0时,a=1,b_3 = m_3 + Σ(e_i)
- 我们得到的23组信息中的每组的第一条就是b_1, b_2,b_3
- 所以我们只需要获得Σ(e_i)就可以还原所有的m
- 被加密的是pri,pri是PEM文件格式,有固定的开头、结尾格式,所以我们知道部分明文,所以我们知道m_1
- 利用b_1和m_1获取Σ(e_i)
- 再利用b_1,,,b_23和Σ(e_i) 获取所有m
- 再利用私钥文件对flag进行解密
exp
1 | # -*- coding: utf8 -*- |
easy_wa
bytectf原题lrlr的一个part
https://blog.csdn.net/qq_33458986/article/details/100699263
calc是一个多项式在GF(2)下的平方运算,我们要做的应该是求根。
但是这里给出的既约多项式的阶不大,我们一直平方下去,很快就能回到起点。所以直接拿密文去calc就行了。
先交互,过那个恶心的PoW 跟青龙组那个一样,再看看名字,同一个出题人,凑!,输入token拿到4组密文
然后每组分别解密
1 | from os import urandom as ua |
就这么ak了网鼎杯的密码学?赵总原话:这届密码学不行。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可联系QQ 643713081,也可以邮件至 643713081@qq.com
文章标题:2020 网鼎杯
文章字数:5.7k
本文作者:Van1sh
发布时间:2020-05-10, 21:15:00
最后更新:2020-06-03, 14:17:48
原始链接:http://jayxv.github.io/2020/05/10/2020网鼎杯/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。