最近开始玩密码学,这是我在BUU的拉垮16000多排名,但是是最近才转到BUU(我不是我没有偷懒) 好了,废话不多说,开始writeup的记录吧
1.MD5
代码语言:javascript复制e00cf25ad42683b3df678c61f42c6bda
打开下载的附件,得到一个密文,这里常规解法是丢到md5破解工具里,解密即可。
直接解出密文:
代码语言:javascript复制admin1
但是我觉得这样还不够,我们应该再深入研究一下这个问题,MD5是一种类似于有损压缩的加密算法,所以没有可以直接解密的算法。
代码语言:javascript复制只能去撞库
通过一些已知的MD5破解网站,可以直接破解得出,我们可以通过爬虫的技术方案去实现。
代码语言:javascript复制https://md5.gromweb.com/
构造payload请求
https://md5.gromweb.com/?md5=e00cf25ad42683b3df678c61f42c6bda
爬取之后,返回的答案在:
< e m class="long-content string">admin1</ e m></ p>这样的标签中
所以这里我们需要配合正则表达式:
print(re.findall(r'<em class="long-content string">(. ?)</em></p>',r.text))
输出即可
这里附上代码:
代码语言:javascript复制import requests
import re
s=input('破解的md5:')
url = 'https://md5.gromweb.com/?md5=' s
try:
r = requests.get(url,timeout=20)
r.raise_for_status()
r.encoding = r.apparent_encoding
except:
print('网络异常或页面未找到,请重试')
print(re.findall(r'<em class="long-content string">(. ?)</em></p>',r.text))
运行结果:
我们当然要训练自己脚本编写能力,这些密码学的题就是非常好的练习题目。 重点:线下比赛没有办法访问这些网站哦。大家一定要存一些脚本或者工具。
今晚有点迟,明天继续更新。
2.一眼就解密
题目:
代码语言:javascript复制下面的字符串解密后便能获得
flag:ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30=
注意:得到的 flag 请包上 flag{} 提交
题目说一眼就解密,看到结尾是“=”,盲猜是Base64,3个字节为一组,需要4个base 64 编码来表达,不够的编码用=来补充。 工具/网站/脚本都可以。 工具:
代码语言:javascript复制将base64解码成字符串
import base64
Crypto = "ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30="
str_url = base64.b64decode(Crypto).decode("utf-8")
print(str_url)
运行结果:
3.Url编码
打开附件,得到一串URL编码。
代码语言:javascript复制flag{and 1=1}
常规的工具,解码网站就不用了,我们来用Python脚本来解码,调用urllib.parse即可
代码语言:javascript复制quote() 编码
unquote() 解码
import urllib.parse
s=input('输入url解码字符串')
print(urllib.parse.unquote(s))
运行结果:
4.看我回旋踢
代码语言:javascript复制题目:synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}
明显看出这就是一个flag{}的形式,但是我们现在需要判断这是哪一种加密方式,观察三秒看出来了吗,好,咱们对比一波。
代码语言:javascript复制标准格式:flag{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
密文形式:synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}
flag与synt有没有像是被移位密码了,所以说猜测是凯撒密码,这里就不用工具了,还是上脚本。 脚本:
emmmm,但是这个位移是自己推出来的,实际比赛中要争取拿一血。大家还可以对代码做一些更好的改进,让其遍历25种可能,直接在输出结果里找到合适的flag就好了。
代码语言:javascript复制flag{5cd1004d-86a5-46d8-b720-beb5ba0417e1}
5.摩丝
代码语言:javascript复制题目:.. .-.. --- ...- . -.-- --- ..-
根据题目,轻松得知这就是摩斯编码,那我们解码一下就好了,还是一样,在线网站和工具的方法就不说了,我们直接上脚本来搞。 脚本:
代码语言:javascript复制from __future__ import print_function
a = input("input the string:")
s = a.split(" ")
dict = {'.-': 'A',
'-...': 'B',
'-.-.': 'C',
'-..':'D',
'.':'E',
'..-.':'F',
'--.': 'G',
'....': 'H',
'..': 'I',
'.---':'J',
'-.-': 'K',
'.-..': 'L',
'--': 'M',
'-.': 'N',
'---': 'O',
'.--.': 'P',
'--.-': 'Q',
'.-.': 'R',
'...': 'S',
'-': 'T',
'..-': 'U',
'...-': 'V',
'.--': 'W',
'-..-': 'X',
'-.--': 'Y',
'--..': 'Z',
'.----': '1',
'..---': '2',
'...--': '3',
'....-': '4',
'.....': '5',
'-....': '6',
'--...': '7',
'---..': '8',
'----.': '9',
'-----': '0',
'..--..': '?',
'-..-.': '/',
'-.--.-': '()',
'-....-': '-',
'.-.-.-': '.'
};
for item in s:
print (dict[item],end='')
#print (s)
运行结果:ILOVEYOU
6.password
题目:
代码语言:javascript复制姓名:张三
生日:19900315
key格式为key{xxxxxxxxxx}
这道题给我看懵了,因为没有密文,有点像脑筋急转弯,然后瞅了半天,包括把下载的文件夹和文件都看了一下,但是没有找到任何可用的消息,最后发现了端倪。
代码语言:javascript复制key{xxxxxxxxxx}
x为10个,张三 19900315刚好是10个字符,于是试了一下
flag{张三19900315} 不对
换了一下:
flag{zs19900315}
搞定。 这道题不做评价了,可能是我没有发现什么考点吧。
7.变异凯撒
题目:
代码语言:javascript复制加密密文:afZ_r9VYfScOeO_UL^RWUc
格式:flag{ }
题目说的很清楚,是变异凯撒密码,那我们就来先分析密文,它哪里与常规的凯撒密码不一样。 由密文可以看出,有大小写字母,并且还有下划线和阿拉伯数字,所以我们基本可以看出需要使用ASCII码表。
代码语言:javascript复制又因为明文flag对应afZ_,所以寻找明文和密文的规律
f-102 a-97 相差5
l-108 f-102 相差6
a-97 Z-90 相差7
g-103 _-95 相差8
可以看出每个字符的偏移量为n 4(n为该串密文每一个字符对应的位置)
所以依次算出各密文字符对应的明文字符求得明文为:
flag{Caesar_variation}
脚本:
代码语言:javascript复制#雷池加密,自定义偏移量(ascii码)的数值。
def caesar(text):
for i in range(len(text)):
y=5 i#偏移规律
print("{}".format(chr(ord(text[i]) y)),end='')#此处的 y 可根据题目要求设置
caesar('afZ_r9VYfScOeO_UL^RWUc')#输入要解密的文本
雷池密码是凯撒密码的一个变种,关于凯撒密码的变种其实还有很有很多,这个脚本改改也还能用,所以说,一定要自己平时收藏一些加密/解密脚本,练习脚本编写能力。
8.Quoted-printable
代码语言:javascript复制题目:=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6
Quoted-printable编码,直接转换就可以。 知识扩充: Quoted-printable可译为“可打印字符引用编码”,编码常用在电子邮件中。 如:Content-Transfer-Encoding: quoted-printable ,它是MIME编码常见一种表示方法! 在邮件里面我们常需要用可打印的ASCII字符 (如字母、数字与"=")表示各种编码格式下的字符!Quoted-printable将任何8-bit字节值可编码为3个字符:一个等号"="后跟随两个十六进制数字(0–9或A–F)表示该字节的数值。例如,ASCII码换页符(十进制值为12)可以表示为"=0C", 等号"="(十进制值为61)必须表示为"=3D",gb2312下“中”表示为=D6=D0。除了可打印ASCII字符与换行符以外,所有字符必须表示为这种格式。因为Quoted-printable编码简单、方便因此在电子邮件中应用广泛。
脚本:
代码语言:javascript复制# coding=gbk
import quopri
str = '=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6'
flag = quopri.decodestring(str).decode('utf8')
print(flag)
好的,我预计打算每8道题为一章节,有错误和更好的建议随时与我交流,一起进步。