BUU-Crypto-第一章

2022-03-22 11:09:44 浏览数 (1)

最近开始玩密码学,这是我在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道题为一章节,有错误和更好的建议随时与我交流,一起进步。

0 人点赞