2021_Crypto
Bigrsa
签到,n1和n2不互素:
1 | from Crypto.Util.number import * |
2022_Misc Crypto
签到
先rot13再base32解密。
EasyMisc
给了个txt,维吉尼亚解密,得到压缩包密码:GWHT@R1nd0yyds
解密得到一个混淆的图片,给了encode.py,直接百度搜索关键代码可以找到Novel_In_Image项目,直接套用decode.py得到输出的txt,观察第一行自卑与超越f
,再搜索字母l
,基本可以确定每个flag字符前面是文字,于是写一个正则过滤一下,再根据flag格式和题目语义确定flag:
1 | import re |
迷失幻境
取证大师直接梭,回收站里两张图有点可疑,导出来,再把图库里的1.png和哒哒哒.jpg导出来,因为这两张图和回收站的看起来一样,可能有隐藏数据。
然后把45补上png4字节文件头,显示正常,和1.png做sub或者xor都可,能得到一个key:
可爱可莉exif信息有:
猜想可能是outgusee(想不到),直接解:
寻宝
给的文件是字节前后部分交换过的zip,用脚本处理一下:
1 | # 处理初始文件,把字节的前后两部分交换位置 |
解压以后,里面有一个exe格式的小游戏,并附了游戏说明:上下左右键控制移动,吃完十字型护符即可进入下一关,注意躲避红色蝎子的攻击,死亡三次则游戏结束。吃到金色甲壳虫后的一段时间会使蝎子进入恐惧状态,此时碰到它们会把它们送回出生点。
温馨提示:第五关开始好像某种神秘的电波
直接打的话非常难,考虑CE修改器,基本教程,首先可以把游戏速度改的很慢来找生命值的内存地址:
修改得很大,然后就可以快乐游戏了:
从第一关到第四关是变异猪圈密码,翻译过来为OWOH
;从第五关开始是某种电波,猜测是电平相关,因为图像类似于电平波动:
不是曼彻斯特就是差分曼彻斯特,测试确定为后者,转为字节:
背景音乐钢琴曲对应数字114514,所以解压密码连起来为OWOH_a1_114514
解压以后txt里面有零宽即为flag GWHT{Wher3_1S_Th4_1gI981O?}
Unlimited Zip Works
首先想的是循环解压,全部解压发现最后得flag.txt是个幌子;用7z可以看到每层压缩包都有注释,也是非常疑惑winrar看不见。所以写个脚本在解压得时候读取注释信息,发现藏的是一个zip文件,遂提取:
1 | import zipfile |
提取出来里面一堆txt,每个txt指向下一个txt,最后发现是封闭的指向,于是按照顺序把文件名连起来,以为是某种编码,结果不是;队友细心发现flag.zip还藏有一个zip,于是提取出来,解压以后里面有一张jpg,不是隐写;最后,发现新的zip注释里还有一个zip,提取出来解压即为flag。ps:真心希望出题别那么套,并且本题干扰的txt,图片还那么多…
脚本:
1 | import zipfile |
DASCTF{I_am_the_DEFLATE_of_my_Zipfile}
补一个010的zip模板解析以后在地址160720位置的冗余数据,即zip开头两个字节:
躲猫猫
首先发现有FTP协议,于是追踪tcp流可以导出zip文件,压缩包里的key.log没有加密,可以导入它解密tls流,然后追踪http流发现跟邮箱附件上传有关的ftn_hander,在其响应流里可分割出jpg图片,也就是压缩包密码:
在tcp流11中可以找到missing_cat.png,导出是经过加密的图片:
解压zip以后得到加密图片的py文件以及secret,搜索一下代码发现是dsctf的密码题,直接套一下脚本就能解了:
1 | from PIL import Image |
得到一张类似于maxicode的图片,把中间的猫咪换成该code的同心圆以后识别出flag。
LRSA
首先通过$gcd$可求$P和Q$
由于等式$(p-58)P+(q-t)=kQ$
$=>(p-58)P-kQ=t-q≈2^{1023}$
构造格子$L=\left[\begin{matrix}1&P\0&Q\end{matrix}\right]$
$=>v=(p-58,t-q)$在L上
且$||v||<\sqrt{2}det(L)^{\frac{1}{2}}$
利用LLL算法求解
1 | from Crypto.Util.number import * |
EasyRsa
每个n共有一个公因子,分解各个n,获取私钥d以后倒着解密12次
1 | from Crypto.Util.number import * |
Solomen’s puzzle 1
首先测试一下源码的函数:
确定纠错码的生成函数
题目给了对明文
生成的四位纠错码由$R(x)$的系数决定,所以题目给的混淆过程只会影响明文部分而非纠错码:
1 | for i in range(0, 256, 8): |
我们在上述方程中取x为$1,\alpha,\alpha^2,\alpha^3$,这样可以保证$g(x)$为0,则得到四个关于m的方程,于是我们利用纠错码解矩阵方程即可,即代码中的A*X = B,解X
1 | from Crypto.Util.number import * |
linearAlgebra
主要考点是用LLL算法解决背包加密类型的问题。
1.分析corrupt函数
1 | def corrupt(Mt, s, n): |
对32x32的矩阵中的随机32个元素进行替换
2.分析已知信息和加密过程
1 | m = pad(flag[7:-1], n) |
首先将flag填充为nxn的长度,然后将m转为矩阵表示M,生成一个随机的系数矩阵A,C=A*M;最后对A随机替换得到AC。
3.格基规约
a.由概率论可知,corrupt随机更改的32个数据分别分布在32行的概率是非常小的,几乎可以断定,有某些行的数据未改。
b.利用未改的该行(a,b,c)乘上flag矩阵的各列(m1,m2,m3),得到的结果可以用于构造格子,记为$y=am_1+bm_2+cm_3$。
c.思路如下,把n阶拓展为n+1阶,比如下方矩阵为3阶,拓展为4阶,最右列为(a,b,c,y),原矩阵的对角线全为1,横向量为格基。
容易发现:$m_1(1,0,0,a)+m_2(0,1,0,b)+m_3(0,0,1,c)-m_4(0,0,0,y)=(m_1,m_2,m_3,0)$,恢复了明文的同时使得向量最后一维为0。通过这个特征可以固定AC的第一列,C的不同行来进行格基规约,当输出最短向量且最后一维为0的时候可以判断改行未改变。固定该行和其他列构造格子再恢复flag的其他部分即可。
1 | import re |