安恒杯二月月赛wp

来玩个游戏吧

下载下来有两个文件,一个题目说明.txt,一个是game.exe

题目说明.txt:

学信息安全的朋友给你发来一封邮件,是一个小程序,有两个关卡,只要你通过这两个关卡,就会收到一封邮件。

但是这封邮件对于一般人的话会当做垃圾邮件处理,但是你知道,朋友所要描述的信息就在这封垃圾邮件当中。

邮件内容是普通的信息,但是你知道绝密消息(flag)就隐藏在其中,需要一个在线的网站去解密,而这个网站使用了栅格密码。

game.exe:

发现第一关的字符串是盲文,不过感觉显示的有点乱,而且也不知道怎样用键盘打出盲文。。就搜了一个可以复制程序文本的工具Textify

复制后用盲文在线解密网站解密:

得到字符串:

??41402abc4b2a76b9719d911017c592

卡到这了,这是神马加密?(看了大佬的wp才发现,我连搜都不会)

由于开头两位是问号,则搜索后面的字符串,发现是hello的md5加密

第二关需要输入两个有着相同md5值的文件,这里用到了一个生成工具fastcoll_v1.0.0.5

在工具目录新建一个a.txt,cd到工具目录

fastcoll_v1.0.0.5.exe -p a.txt -o a1.txt a2.txt

之后将这两个文件路径填上去第二关就过了,邮件接收区会显示一堆感觉是乱写的英文:

由于题目说明中提示栅格密码,搜索一下发现了使用栅格密码的网站

http://www.spammimic.com

解码即可

真是想半天还不如搜索一下

密码本

这题太考脑洞了。。

下载下来有两个文件,一个为题目描述.txt,一个为cipher.txt

题目描述.txt:

这个密码本本该只使用一次的,但是却使用了多次,导致密文易被破解
经过一番尝试发现,秘钥的首字母很可能是y,剩下的就靠你了

cipher.txt:

cip1: rlojsfklecby
cip2: ulakqfgfsjlu
cip3: dpaxwxtjgtay

了解了一些维吉尼亚加密(多表代换密码):

设密钥K=(k1,k2,…,kd),明文M=(m1,m2,…,mn),密文C=(c1,c2,…,cn);

加密变换为:ci=Eki(mi)=mi+ki(mod 26)

解密变换为:mi=Dki(ci)=ci-ki(mod 26)

写python脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
while 1:
key = input() # 秘钥

# 密文
c1 = 'rlojsfklecby'
c2 = 'ulakqfgfsjlu'
c3 = 'dpaxwxtjgtay'

# 明文
res1 = ''
res2 = ''
res3 = ''

for i in range(0,len(key)):
res1 += chr((ord(c1[i]) - ord(key[i])) % 26 + 97)
res2 += chr((ord(c2[i]) - ord(key[i])) % 26 + 97)
res3 += chr((ord(c3[i]) - ord(key[i])) % 26 + 97)

print(res1)
print(res2)
print(res3)

由于提示秘钥首位是y尝试后发现输出为

t
w
f

根据最后一个明文首字母为f,则猜测最后一个明文的第二个字母为l、第三个为a、第四个为g

得到其对应的秘钥为year,尝试后输出:

thos
what
flag

根据第一个解出的明文,猜测下一位明文为e,其对应的秘钥为o

输入yearo,输出:

those
whatc
flagi

根据最后一个明文,猜测下一位字母为s,其对应的秘钥为f

输入yearof,输出:

thosea
whatca
flagis

根据第二个明文,猜测下一位为n,其对应秘钥为t

输入yearoft,输出:

thosear
whatcan
flagisa

此时猜测秘钥后面为he,即yearofthe,输出为:

thosearea
whatcanyo
flagisacc

根据第二个明文,下一位应该为u,对应秘钥为p,输入yearofthep,输出:

thosearean
whatcanyou
flagisacce

根据第三个明文可推断出剩下的两位为ss,对应秘钥为ig,输入yearofthepig,输出:

thoseareants
whatcanyoudo
flagisaccess

太强了这猜想能力,膜拜大佬

https://www.anquanke.com/post/id/171543

膜拜出题人,解密过程中这三个字符串真是相辅相成,nb

hahaha

根据文件大小,推断出可以使用CRC32爆破:

得到:

tanny_is_very_beautifu1_

解压得到flag.pdf:

也就是说可选的字符有:

!@12e[]{}asfghlcn

根据flag格式,可以排除一些:

格式:flag{}
可选:!@12eshcn

之后想用写脚本的方法爆破出来,不过写不出来脚本。。。字符串怎样进行排列组合呢?

参考大佬的文章https://blog.csdn.net/neweastsun/article/details/51965226,了解到了python内置模块itertools的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# itertools提供了非常有用的用于操作迭代对象的函数
import itertools

# permutations(p, r);返回p中任意取r个元素做排列的元组的迭代器
for i in itertools.permutations([1,2,3], 3):
print(i)

'''
输出:
(1, 2, 3)
(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)

'''

不确定是按了12还是!@、1@或!2,反正就是4选2,写了个脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import hashlib
import itertools

str1 = '1!'
str2 = '2@'

#str3 = 'eshcn' + str1[0] + str2[0]
str3 = 'eshcn' + str1[0] + str2[1]
#str3 = 'eshcn' + str1[1] + str2[0]
#str3 = 'eshcn' + str1[1] + str2[1]

for i in itertools.permutations(str3, len(str3)):
sorted_str3 = ''.join(i)
flag = 'flag{' + sorted_str3 + '}'
if hashlib.sha1(flag.encode('utf-8')).hexdigest() == 'e6079c5ce56e781a50f4bf853cdb5302e0d8f054':
print(flag)
break

print('over')

得到flag

非常简单的流量分析

http://www.gtfly.top/2019/03/11/流量分析-网络层安全协议-IPsec/#more