2021“长城杯”_MISC_“你这flag保熟吗”_复现

2021“长城杯”_MISC_“你这flag保熟吗”_复现_第1张图片

直接解压“flag.rar”发现存在密码,而且4~6位密码爆破失败,说明密码的获取要从另外的两个PNG图片获取。

直接将图片都拿去binwalk分解一下(binwalk -e 1.png)、(binwalk -e 2.png)

分别得到一个“password.xls”文件以及一个“hint.txt”

2021“长城杯”_MISC_“你这flag保熟吗”_复现_第2张图片

 

2021“长城杯”_MISC_“你这flag保熟吗”_复现_第3张图片

 单独看password.xls 看不懂,但是看hint.txt就比较明显,有base64解码,而且还有类似于加密后的信息“Vm0wd2QyUXlVWGxW”,但是直接拿去解码是得不到什么有用的信息的,所以还是要结合password.xls来获取信息。

大致看了一下,发现“Vm0wd2QyUXlVWGxW”这段信息很大的可能是出自password.xls的,因为在password.xls上包含了大部分的大小写字母以及“=”。

仔细观察一下,猜测“Vm0wd2QyUXlVWGxW”这段信息应该还没有完全,所以要在password.xls中找出刻画这段信息的方式。

2021“长城杯”_MISC_“你这flag保熟吗”_复现_第4张图片

发现是希尔伯特曲线,直接上代码:

import xlrd
from hilbertcurve.hilbertcurve import HilbertCurve
data=xlrd.open_workbook('./password.xls')
table=data.sheets()[0]

rows=table.nrows
cols=table.ncols
hilbert_curve = HilbertCurve(17, 2)

str1=''
for k in range(rows*cols):
    [i,j]=hilbert_curve.point_from_distance(k)
    str1+=table.cell_value(i,j)
#print(str1)
#发现太多数据,可能会导致程序崩掉
#所以写文件比较可行。
file=open('base.txt','wb')
file.write(str1.encode())
file.close()

 写好文件后,得到一大串的base64代码,不过我们在结尾发现有很多的“=”,所以需要我们手动调整数据,把等号删除掉只剩下两个或者一个。

最后在用程序解码即可:

import base64
file=open('base.txt','r')
string=file.read()
while True:
    string=base64.b64decode(string)
    print(string)

 这个“1f_y0u_h4ve_7he_fllllllag,_I_muSt_vvant_1t!”就是我们的解压秘密了。

解压成功后,得到一个flag.php文件,直接打开后,

2021“长城杯”_MISC_“你这flag保熟吗”_复现_第5张图片

 很明显的brainfuck(BF)密码了。

直接拿去解密,发现报错了,后来参考大佬的做法是拿去看了BF执行的栈。

在线BF

 直接将所有的BF代码CV上去,2021“长城杯”_MISC_“你这flag保熟吗”_复现_第6张图片

 发现是网站的长度不够,报错了

这个就需要我们自己手动来调整,分段衔接好结果。

这里我是在这里开始的

 因为直接从27行开始会直接报错,具体可以参考一下BF的原理。BF分析

2021“长城杯”_MISC_“你这flag保熟吗”_复现_第7张图片

简单拼接一下,得到:

117,111,122,116,123,83,114,82,114,82,121,118,105,103,95,88,102,105,101,118,95,49,72,95,49,72,95,52,95,101,101,48,109,119,118,105,117,102,33,95,120,102,105,101,118,125,101,114,114,111,114

因为都没有超过128,都是可打印字符,所以猜测是ASCII码。

2021“长城杯”_MISC_“你这flag保熟吗”_复现_第8张图片 

 对比一下flag{xxxxxxxxx}形式

=>'f'=>'u' , 'l'=>'o','a'=>'z','g'=>'t'
明显的atbash密码

list2=['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']
list3=['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']
tmp=0
string=input("输入:")
output=''
for i in string:
    if(i in list2):
        tmp=list2.index(i) #获取索引
        output+=list2[len(list2)-tmp-1]
    elif(i in list3):
        tmp=list3.index(i) #获取索引
        output+=list3[len(list3)-tmp-1]
    else:
        output+=i
print(output)

结果:

 参考Mumuzi大佬博客第一届长城杯 部分WP_是Mumuzi的博客-CSDN博客

你可能感兴趣的:(CTF,MISC,网络安全)