loading...
BUUCTF-Crypto系列[1-16]WP
Published in:2021-07-19 | category: 密码学 BUUCTF

MD5

MD5信息摘要算法(Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald LinnRivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

MD5算法的实现及原理①

MD5算法的实现及原理②

点开附件,显示如下:

e00cf25ad42683b3df678c61f42c6bda

通过在线工具进行解密,明文如下:

admin1

提交结果加上”flag{}”就可以啦。


Url编码

url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如 “\” ,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。 特点:密文中有多个%号符。

点开附件,显示如下:

%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d

通过在线工具解密,明文如下:

flag{and 1=1}

直接提交即可。


一眼就解密

题目已经有密文:

ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30=

为什么看一眼就能解密呢?原因在于末尾有一个很明显的”=”,而且密文中存在小写字母,可以排除掉base16和base32。

直接base64走起,上代码(前面写过的):

import base64

Str1 = "ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30="
print ("flag{" + str(base64.b64decode(Str1)) + "}")

可以得到明文为:

flag{THE_FLAG_OF_THIS_STRING}

看我回旋踢

点开附件,显示如下:

synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}

题目明确格式为”flag{}”,在计算了字母序号的相对差,可以明确这是一道简单的Caesar密码题,由于密文中只有小写字母,所以这里我们不考虑大写字母,代码如下(方法笨了点):

cipher = "synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}"
plainer = ""

for n in range(2, 25):
    for i in cipher:
        a = ord(i)
        if 96 < a and a < 123:
            plainer += chr(ord(i) - n)
        else:
            plainer += chr(ord(i))

print(plainer)

解得密文为:

flag{5cd1004d-86a5-46d8-b720-beb5ba0417e1}

摩丝

点开附件,显示如下:

.. .-.. --- ...- . -.-- --- ..-

通过在线解密工具,明文如下:

ILOVEYOU

password

点开附件,显示如下:

姓名:张三 
生日:19900315

key格式为key{xxxxxxxxxx}

看了看大佬的博客,发现这竟然是社会工程学的题!!!

科普一下什么是社会工程学

​ 在信息安全这个链条中,人的因素是最薄弱的一环节。社会工程就是利用人的薄弱点,通过欺骗手段而入侵计算机系统的一种攻击方法。组织可能采取了很周全的技术安全控制措施,例如:身份鉴别系统、防火墙、入侵检测、加密系统等,但由于员工无意当中通过电话或电子邮件泄露机密信息(如系统口令、IP地址),或被非法人员欺骗而泄露了组织的机密信息,就可能对组织的信息安全造成严重损害。 社会工程学通常以交谈、欺骗、假冒或口语等方式,从合法用户中套取用户系统的秘密。熟练的社会工程师都是擅长进行信息收集的身体力行者。很多表面上看起来一点用都没有的信息都会被这些人利用起来进行渗透。比如说一个电话号码,一个人的名字,或者工作的ID号码,都可能会被社会工程师所利用。

题目给的格式中’x’的个数为10,猜测是名字首字母+生日

答案是:

key{zs19900315}

变异凯撒

点开附件,显示如下:

加密密文:afZ_r9VYfScOeO_UL^RWUc
格式:flag{}

还是根据题目提供的格式,分析密文与明文之间的ASCII码的关系。分析前四个,发现从第一个字符相差5到第四个字符相差8,总结为公差为1的等差数列。可以借用上题Caesar的脚本:

cipher = "afZ_r9VYfScOeO_UL^RWUc"
plainer = ""

n = 5
for i in cipher:
    plainer += chr(ord(i) + n)
    n += 1

print(plainer)

解得:

flag{Caesar_variation}

Quoted-printable

什么是Quoted-printable:

它是多用途互联网邮件扩展(MIME) 一种实现方式。其中MIME是一个互联网标准,它扩展了电子邮件标准,致力于使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。目前http协议中,很多采用MIME框架!quoted-printable 就是说用一些可打印常用字符,表示一个字节(8位)中所有非打印字符方法!

编码方法:

任何一个8位的字节值可编码为3个字符:一个等号”=”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值.例如,ASCII码换页符(十进制值为12)可以表示为”=0C”, 等号”=”(十进制值为61)必须表示为”=3D”. 除了可打印ASCII字符与换行符以外,所有字符必须表示为这种格式.

所有可打印ASCII字符(十进制值的范围为33到126)可用ASCII字符编码来直接表示, 但是等号”=”(十进制值为61)不可以这样直接表示.ASCII的水平制表符(tab)与空格符, 十进制为9和32, 如果不出现在行尾则可以用其ASCII字符编码直接表示。如果这两个字符出现在行尾,必须QP编码表示为”=09″ (tab)或”=20″ (space).

如果数据中包含有意义的行结束标志,必须转换为ASCII回车(CR)换行(LF)序列,既不能用原来的ASCII字符也不能用QP编码的”=”转义字符序列。 相反,如果字节值13与10有其它的不是行结束的含义,它们必须QP编码为=0D与=0A.

quoted-printable编码的数据的每行长度不能超过76个字符. 为满足此要求又不改变被编码文本,在QP编码结果的每行末尾加上软换行(soft line break). 即在每行末尾加上一个”=”, 但并不会出现在解码得到的文本中.

例如:If you believe that truth=beauty, then surely mathematics is the most beautiful branch of philosophy. 编码后结果是

If you believe that truth=3Dbeauty, then surely=20=
mathematics is the most beautiful branch of philosophy.

点开附件,显示如下:

=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6

通过在线解密工具,可得明文为:

那你也很棒哦

Rabbit

不懂,直接百度,在百度上关于Rabbit密码的知识很少,所以转去了知网。

点开附件,显示如下:

U2FsdGVkX1/+ydnDPowGbjjJXhZxm2MP2AgI

通过在线工具进行解密,明文如下:

Cute_Rabbit

按照题目格式提交即可。


篱笆的影子

点开附件,发现是一道栅栏密码题,估摸着是传统型,密文如下:

felhaagv{ewtehtehfilnakgw}

搞个脚本解密:

#cipher为密文,count为栏数
def decrypto(cipher, count):
    cipher_len = len(cipher)

    #分为多少组,row为组数
    if(cipher_len % count == 0):
        row = int(cipher_len / count)
    else:
        row = int(cipher_len / count + 0.5)
    result =  {x: ''for x in range(row)}

    #对字符进行按组划分
    for i in range(cipher_len):
        k = i % row;
        result.update({k: result[k] + cipher[i]})

    #按组输出
    plainer = ""
    for i in range(row):
        plainer += result[i]
    print(plainer)

for n in range(2,20):
    decrypto("felhaagv{ewtehtehfilnakgw}", n)

然后我们在多个结果里面筛选出符合题目格式的明文,明文如下:

flag{wethinkwehavetheflag}

RSA

点开附件,题目内容如下:

在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flag提交

简单题,根据e d ≡ 1 mod Φ(n), Φ(n) = (p - 1) (q - 1),很容易就可以解得d,上脚本:

from Crypto.Util.number import inverse
import gmpy2
import libnum

p = 473398607161
q = 4511491
e = 17
phi = (p - 1) * (q - 1)
d = inverse(e, phi)
print(d)

解得d为:

125631357777427553

按照题目给的格式提交即可。


丢失的MD5

点开文件,发现是一个py文件,代码如下:

import hashlib   
for i in range(32,127):
    for j in range(32,127):
        for k in range(32,127):
            m=hashlib.md5()
            m.update('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 des

整个过程在进行哈希运算,推测输出的内容是答案。

运行脚本,输出如下:

flag{e9032994dabac08080091151380478a2}

Alice与Bob

这道题给出了解题思路:

直接分解98554799767为两个素数

分解结果

分解后,小的放前面,大的放后面,合成一个新的数字,进行md5的32位小写哈希,提交答案。

代码部分:

import hashlib
date = '101999966233'
#获取MD5加密算法对象
hmd5 = hashlib.md5()
#引入需要加密的字符串,hashlib是对二进制进行加密的,如果直接对字符串加密的话,会报错的。
# 因此需要通过encode将字符串转码成二进制格式。
hmd5.update(date.encode("utf-8"))
#最后转成16进制字符串
sig = hmd5.hexdigest()
sig.upper()
print("flag{" + sig + "}")

答案是:flag{d450209323a847c8d01c6be47c81811a}


rsarsa

查看文件:

Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm.


p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

Use RSA to find the secret message

题目给了两个大素数、公钥、密文,要求的是明文。根据 e * d = 1mod Φ(n),m = c ^ d mod n,就可以解得明文。

from Crypto.Util.number import inverse
import gmpy2
import libnum

p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
n = p * q
phi = (p - 1) * (q - 1)
d = inverse(e, phi)

m = pow(c, d, n)
print(m)

解得明文为:

5577446633554466577768879988

按照题目的格式提交即可。


大帝的密码武器

将文件下载下来后,把后缀修改为”zip”,解压,题目为:

公元前一百年,在罗马出生了一位对世界影响巨大的人物,他生前是罗马三巨头之一。他率先使用了一种简单的加密函,因此这种加密方法以他的名字命名。
以下密文被解开后可以获得一个有意义的单词:FRPHEVGL
你可以用这个相同的加密向量加密附件中的密文,作为答案进行提交。

还是比较简单的,写个脚本解密,然后再按照偏移量加密“密文”,就可以得到答案。

cipher = "FRPHEVGL"
plainer = ""

for n in range(2, 25):
    for i in cipher:
        a = ord(i) - n
        if a < 65:
            plainer += chr(a + 26)
        else:
            plainer += chr(a)
    plainer += "\n"
print(plainer)

输出结果有多个:

DPNFCTEJ
COMEBSDI
BNLDARCH
AMKCZQBG
ZLJBYPAF
YKIAXOZE
XJHZWNYD
WIGYVMXC
VHFXULWB
UGEWTKVA
TFDVSJUZ
SECURITY
RDBTQHSX
QCASPGRW
PBZROFQV
OAYQNEPU
NZXPMDOT
MYWOLCNS
LXVNKBMR
KWUMJALQ
JVTLIZKP
IUSKHYJO
HTRJGXIN

根据题目提示,是一个有意义的单词,从中找出了”SECURITY”,得到偏移量为13,接着用相同的偏移量加密。

cipher = ""
plainer = "ComeChina"

for i in plainer:
    a = ord(i) + 13
    if a > 122:
        cipher += chr(a - 26)
    else:
        cipher += chr(a)
print(cipher)

得到密文:

PbzrPuvan

按照题目格式提交即可。


Windows系统密码

Windows系统密码加密方式

Windows:
SAM文件一般存放在C:\Windows\System32\Config下,存在LM-Hash与NT-Hash两种加密方式。
Windows 系统 下的hash密码格式为:
用户名称:RID:LM-HASH值:NT-HASH值,例如:
Administrator:500:C8825DB10F2590EAAAD3B435B51404EE :683020925C5D8569C23AA724774CE6CC:::
用户名称为:Administrator
RID为:500
LM-HASH值为:C8825DB10F2590EAAAD3B435B51404EE
NT-HASH值为:683020925C5D8569C23AA724774CE6CC
关于Windows下LM-Hash值生成原理:
假设明文口令是“Welcome”,首先全部转换成大写“WELCOME”,再做将口令字符串大写转后后的字符串变换成二进制串: “WELCOME” -> 57454C434F4D4500000000000000
说明:如果明文口令经过大写变换后的二进制字符串不足14字节,则需要在其后添加0×00补足14字节。然后切割成两组7字节的数据,分别经str_to_key()函数处理得到两组8字节数据:
57454C434F4D45 -str_to_key()-> 56A25288347A348A
00000000000000 -str_to_key()-> 0000000000000000
这两组8字节数据将做为DESKEY对魔术字符串“KGS!@#$%”进行标准DES加密
“KGS!@#$%” -> 4B47532140232425
56A25288347A348A -对4B47532140232425进行标准DES加密-> C23413A8A1E7665F
0000000000000000 -对4B47532140232425进行标准DES加密-> AAD3B435B51404EE
将加密后的这两组数据简单拼接,就得到了最后的LM Hash
LM Hash: C23413A8A1E7665FAAD3B435B51404EE
由于LM-Hash只能最大限制14位密码,安全性较差,NT-Hash应运而生。
假设明文口令是“123456”,首先转换成Unicode字符串,与LM Hash算法不同,这次不需要添加0×00补足14字节
“123456″ -> 310032003300340035003600
从ASCII串转换成Unicode串时,使用little-endian序。对所获取的Unicode串进行标准MD4单向哈希,无论数据源有多少字节,MD4固定产生128-bit的哈希值,16字节310032003300340035003600 -进行标准MD4单向哈希-> 32ED87BDB5FDC5E9CBA88547376818D4 就得到了最后的NTLM Hash:
NTLM Hash: 32ED87BDB5FDC5E9CBA88547376818D4
与LM Hash算法相比,明文口令大小写敏感,无法根据NTLM Hash判断原始明文口令是否小于8字节,摆脱了魔术字符串”KGS!@#$%”。MD4是真正的单向哈希函数,穷举作为数据源出现的明文,难度较大。

查看文件:

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::

由于不知道明文的一些部分,解密起来很困难,所以这里先做个伏笔吧,等学到更多的知识的时候再过来写脚本解密。

使用在线解密工具,解得明文为:

good-luck

按照格式提交即可。


参考:

流密码Rabbit的安全性研究

流密码Rabbit的安全性分析

http://blog.chacuo.net/494.html

Prev:
BUUCTF-Crypto系列[17-32]WP
Next:
攻防世界crypto新手区杂题
catalog
catalog