【CTF入门】BUUCTF Crypto刷题(持续更新)
一眼就解密
题目介绍如图:
我们可以发现加密的字符串由base64编码,因此base64解码后即可解密。什么是base64编码,又应该如何解码呢?
base64编码介绍
原理:https://www.bilibili.com/video/BV1hk4y1S7PJ?vd_source=69c558b0c7be97607c79afbd75bd1f7c
密文特征:
乱码尾部通常有一两个等号。
回到题目,base64解码并不是很难的事,在网上搜索base64解码都能搜索出很多在线工具可以进行解码:
个人常用解码工具网址为:CyberChef,它还有离线版本,是非常强大的集合解密工具。
使用工具base64解码后即可获得flag
考点:base64解码
MD5
下载文件,打开发现加密字符串:
根据题目名我们可以知道字符串经历了MD5算法加密,那么我们应该怎么解密呢?
HASH算法介绍
MD5系列算法是HASH算法的一种,在此我们介绍下什么是HASH算法。
原理:https://www.bilibili.com/video/BV1SZ4y1z7wT?vd_source=69c558b0c7be97607c79afbd75bd1f7c
密文特征:
都是固定长度,常见经历过MD5算法加密的密文为32位字符串。
回到题目,通过学习我们知道HASH算法是不可逆向运算的,但如果明文是非常简单的字符串我们还是可以基于暴力破解和彩虹表来进行解密的。(MD5解密本质上是加速了杂凑冲撞,即找到产生相同MD5串的原文的方法,而不是真正的解密)
在此推荐一些MD5解密在线网站:md5在线解密破解,md5解密加密 (cmd5.com)
CrackStation - Online Password Hash Cracking - MD5, SHA1, Linux, Rainbow Tables, etc.
还有一些破解MD5的工具:hashcat、John the Ripper在此不过多介绍
我们在在线网站上进行解密,得到了flag内容:
按照题目说明,包上flag{}提交
考点:MD5系列算法解密
Url编码
下载文件,打开发现加密字符串:
我们可以发现加密的字符串由url编码,因此url解码后即可解密。什么是url编码?
Url编码介绍
URL 编码是将 URL 中不可打印的字符或具有特殊含义的字符转换为 Web 浏览器和服务器普遍接受的字符的过程。例如! -> %21;# -> %23等。
密文特征:
都是由 "%"和十六进制数字组成。
回到题目,使用解码工具即可解密:
考点:理解url编码
看我回旋踢
下载文件,打开发现加密字符串:
根据密文特征与题目提示(回旋踢),我们可以确定加密方式为ROT13加密(回转13位)
ROT13加密介绍
是一种简易的替换式密码算法,也是过去在古罗马开发的凯撒密码的一种变体。
原理:
密文特征:
纯乱码,但flag的格式不会改变。个人认为得靠提示与运气。
回到题目,使用解码工具即可解密:
考点:理解ROT13加密
摩丝
下载文件,打开发现加密字符串:
鉴定为大名鼎鼎的摩斯电码,可以直接上工具
摩斯电码介绍
原理:摩尔斯电码_百度百科 (baidu.com)
密文特征:
只有两种格式的字符串。
回到题目,使用解码工具即可解密:
考点:知道摩斯电码加密
password
下载文件,打开发现这些:
一看让人摸不着头脑,让我们发散思维,根据题目名(password)这是让我们猜测张三的密码。这涉及到社会工程学攻击。
社会工程学
原理:https://www.bilibili.com/video/BV15V411u7Za?vd_source=69c558b0c7be97607c79afbd75bd1f7c
根据题目内容,我们已经得到了张三的生日信息以及密码为十位数。这是一道CTF题目,根据已有信息我们可以进行排列组合猜测密码:zs19900315、Zs19900315、zS19900315、ZS19900315、19900315zs……
包上flag{}提交,猜测正确
考点:发散思维想到社工打击
变异凯撒
下载文件,打开发现这些:
根据题目我们可以知道这是与凯撒密码相关的,也就是与位移密码相关。
密文中含有特殊字符,因此以ascii表对密文与明文进行对照,根据格式我们可以知道”flag“经过加密后的密文为“afZ_”
f——102,a——97 相差5
l——108,f——102 相差6
a——97,Z——90 相差7
g——103,_——95 相差8
按照这个规律,我们可以依次计算下去,或者是自己编写python脚本来进行解密:
ciphertext = 'afZ_r9VYfScOeO_UL^RWUc'
j = 5
for i in ciphertext:
print(chr(ord(i) + j), end='') #凯撒密码从5开始递增
j += 1
ord():返回一个字符的ASCII值
最终运算出flag
考点:寻找出移位密码的规律
Quoted-printable
下载文件,打开发现加密字符串:
鉴定为Quoted-printable编码,可以直接上工具
Quoted-printable编码介绍
原理:
Q:试将数据 01001100 10011101 00111001进行quoted-printable编码,并得出最后传送的ASCII编码。
A:
(来源:MIME之quoted-printable编码与base64编码(例题+图解)-CSDN博客)
密文特征:
以一个“=”和两位十六进制数字堆积组成字符串。
回到题目,由cyberchef工具可以得到:
怎么乱码了?别急,cyberchef的输出编码出了问题,这道题目的flag很有可能不是英文字符
我们在output底下那一栏更改输出字符编码方式,改为utf-8即可
包上flag{},提交成功
补充:UTF-8编码
原理:https://www.bilibili.com/video/BV1kD4y1z7ft?vd_source=69c558b0c7be97607c79afbd75bd1f7c
篱笆墙的影子
下载文件,打开发现加密字符串:
根据题目名字,这很有可能是栅栏(篱笆:fence)密码
栅栏密码介绍
原理:https://www.bilibili.com/video/BV1TE41177qP?vd_source=69c558b0c7be97607c79afbd75bd1f7c
密码特征:
flag{}格式的“{}”不在它应该在的位置。
我们进行分析,发现flag{的位置:
可以推断出栅栏栏数为2,如果实在不想推直接把所有栏数都爆破一遍也行
用栅栏密码加密后发现了flag:
Rabbit
下载文件,打开发现加密字符串:
根据题目名,我们能知道字符串进行了rabbit加密。
Rabbit加密介绍
Rabbit 是一种高速流密码,于 2003 年在 FSE 研讨会上首次提出。 Rabbit 使用一个 128 位密钥和一个 64 位初始化向量。 该加密算法的核心组件是一个位流生成器,该流生成器每次迭代都会加密 128 个消息位。(来源:【BUUCTF】Crypto题解_buuctf crypto答案-CSDN博客)
用解密工具进行解密:
cyberchef可能只能使用需要秘钥的rabbit加密,所以在此使用了其他在线网站解出了flag
RSA
下载文件,打开发现这些:
这更类似于一道数学题,在此之前我们先学习一下RSA的算法步骤
RSA加密介绍
原理:https://www.bilibili.com/video/BV1XP4y1A7Ui?vd_source=69c558b0c7be97607c79afbd75bd1f7c
知道了RSA的算法后我们便能够计算d的值了,直接编写脚本:
p = 473398607161
q = 4511491
e = 17
n = p*q
phi = (p-1)*(q-1)
d = pow(e,-1,phi)
print(d)
pow():返回e的-1次方,并对结果与phi进行模运算
运行脚本,我们可以得到d的值:125631357777427553
考点:理解RSA加密原理并运用p、q、e计算出d
丢失的MD5
下载文件,打开发现这些:
我们对脚本进行分析:
import hashlib #导入hashlib库:这个库提供了多种哈希算法,如MD5、SHA-1等,用于生成数据的哈希值。
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5() # 创建一个新的MD5对象
m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM') # 嵌套循环生成字符串,并计算字符串的MD5哈希值
des=m.hexdigest() #获取哈希值的十六进制表示
if 'e9032' in des and 'da' in des and '911513' in des: #检查哈希值是否包含指定的字符串
print des #输出哈希值
脚本在计算明文'TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM'的MD5哈希值,并只输出含有'e9032'、'da'和'911513'三个字符串的密文,按照一般思路我们应该寻找相应的明文。
很简单,我们修改一下程序就能输出相关明文:
import hashlib #导入hashlib库:这个库提供了多种哈希算法,如MD5、SHA-1等,用于生成数据的哈希值。
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5() # 创建一个新的MD5对象
m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM') # 嵌套循环生成字符串,并计算字符串的MD5哈希值
mingwen='TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM' #记录生成的字符串
des=m.hexdigest() #获取哈希值的十六进制表示
if 'e9032' in des and 'da' in des and '911513' in des: #检查哈希值是否包含指定的字符串
print mingwen #输出符合条件的明文
运行脚本就有了:
但是提交发现是错误的!!!为什么!!!
上网搜了下别人的write up发现原来flag是原来输出的MD5哈希值...也就是说直接运行源程序的输出就是flag
考点:会运行python文件……
标签:BUUCTF,加密,chr,flag,Crypto,解密,CTF,字符串,MD5 From: https://www.cnblogs.com/handsomexuejian/p/18305321