安恒杯-杂项-MISC-喵喵喵
——2018年1月21日
题目文件: 点击打开链接 提取密码:1qr6
拿到这个题目是一张图片
首先看一下是不是隐写,用stegsolve查看之后发现,查看不同的色道不能直接找到结果。(最简单的办法就是一直按“右键头”)
再看看十六进制,用 binwalk 跑一下
发现好像只有 png 文件头,后来找了写关键字发现也没有,那就还有一种可能 LSB隐写,这个原理我还不太清楚,感兴趣的同学可以自己查一查最终还是被我找到了一点异常的东西
打开stegsolve->analyse->Data Extract
按照图中的顺序操作,最后在生成的数据头部发现藏有一张PNG图片,我们选择 Save Bin ,再从保存的文件拖到十六进制编辑器中,我用的是
HxD.exe
这个软件,会发现他的头两个十六进制数据不是PNG文件头,删掉即可,即上图中最开始的“ff fe”,然后保存下来。
打开之后只是这样的
这个图片一看就知道肯定是个二维码,但是缺少了一半,通过常识,我们应该知道二维码是一个正方形的图片
这时候就需要再次查看一下他的十六进制文件,我们知道PNG文件的大小在文件按头部有显示,如下:
可以看出他是一个118H*8CH像素大小的图片,显然这不是一个正方形,我们应该将8CH改为118H,得到下图:
这就很兴奋了,拿起手机扫一扫发现扫不出来,这时候联想到这应该是一个反色,把它拖到PS里面处理一下,(图像->调整->反相)保存,即可:
这里我用这个网站处理的图片
https://online-barcode-reader.inliteresearch.com/
点击打开链接
选择你的二维码,然后添加文件,Read的结果是
是一个网盘链接,打卡之后有一个 flag.zip 下载下来,打开之后你会很无语:
当时一下子蒙圈了,这都是对的呀,怎么会这样,仔细再分析一下,给的rar好像数据量有点大,后面那么多数据是怎么回事,我把解压好的txt文件又压缩生成了一个压缩包文件,我比较了一下两个文件的大小:
这两个文件的大小相差如此之大!!!一定还藏了什么东西,果然有猫腻!
这是结合提示,知道了还有 NTFS隐写 ,不知道是什么东西然后查了查:
https://www.cnblogs.com/Chesky/p/ALTERNATE_DATA_STREAMS.html 点击打开链接
然后用它说的工具看了看:
正如上图所示:(把放flag.rar文件的那个文件夹添加,点击搜索)
发下有一个 flag.pyc ,把它导出来,大家都知道 pyc 是python的字节码文件,我们需要反编译:直接上在线反编译的网站:
https://tool.lu/pyc/ 点击打开链接
通过反编译我们得到如下代码:
#!/usr/bin/env python
# encoding: utf-8
# 访问 http://tool.lu/pyc/ 查看更多信息
import base64
def encode():
flag = '*************'
ciphertext = []
for i in range(len(flag)):
s = chr(i ^ ord(flag[i]))
if i % 2 == 0:
s = ord(s) + 10
else:
s = ord(s) - 10
ciphertext.append(str(s))
return ciphertext[::-1]
ciphertext = [
'96',
'65',
'93',
'123',
'91',
'97',
'22',
'93',
'70',
'102',
'94',
'132',
'46',
'112',
'64',
'97',
'88',
'80',
'82',
'137',
'90',
'109',
'99',
'112']
很容易看出这是一个把 flag ,加密了的算法,然后给了一个最后生成的数组,我们要做的就是把这个数组当作已知量,编写解密脚本,最后生成的字符串就是flag
解密脚本:
#!/usr/bin/env python
# encoding: utf-8
# 访问 http://tool.lu/pyc/ 查看更多信息
ciphertext = [
'96',
'65',
'93',
'123',
'91',
'97',
'22',
'93',
'70',
'102',
'94',
'132',
'46',
'112',
'64',
'97',
'88',
'80',
'82',
'137',
'90',
'109',
'99',
'112']
def encode():
flag = '*************'
ciphertext = []
for i in range(len(flag)):
s = chr(i ^ ord(flag[i]))
if i % 2 == 0:
s = ord(s) + 10
else:
s = ord(s) - 10
ciphertext.append(str(s))
return ciphertext[::-1]
def decode ():
i=0
flag=''
for str in ciphertext[::-1]:
s=int(str)
if i%2 == 0:
s=s-10
else:
s=s+10
flag_bit=i^s
flag=flag+chr(flag_bit)
i=i+1
print chr(flag_bit)
print flag
decode()
我稍稍优化了一下,运行脚本输出的结果是:
flag{Y@e_Cl3veR_C1Ever!}
总的来说这个题考的非常综合,涉及到的知识面也很广,出题人费心了啊!!!