下载附件,解压得到两张图片和一个txt,先打开txt看一下:
txt里应该是解密的提示,里面提到了压缩包密码,但是下载下来的压缩包并不需要密码,说明应该有一个加密过的压缩包被隐藏了。
直接使用binwalk,在password.png里分离出了一个压缩包,里面是一个flag.docx文件,看来正是提示里说的压缩包了
接下来开始找压缩包密码,打开 作业.png,是一段代码,部分被遮挡了;打开password.png可以看到一张二维码图片,由于颜色问题扫不出来,结合提示,代码应该是修复二维码用的,而代码也是不完整的
分析修复方式的代码,根据未被遮挡的部分可以看出,首先创建了一个图片“new”,尺寸为255*255,像素是(255,255,255),也就是一张纯白的图片
然后又有一个图片“xin”,尺寸是1*1,也就是一个像素的大小
python输入new.p可以补全语句,得到倒数第二行应该是new.paste(xin,(x,y)),作用是将“xin”这个像素点粘贴到“new”上
接下来就剩第6、7行的遮挡不清楚是什么了,在下是python初学者,实在是不知道该如何还原这两行代码,不过可以尝试分析一下还原逻辑。要想还原二维码,那就需要把二维码的部分变成黑的(对应的RGB为(0,0,0)),背景变成白的(255,255,255)
这里注意到第6行有一个对68取余的动作,不禁让人思考为什么是68?
联想到二维码的黑灰渐变,也许和颜色有关。用ps对图片的像素点进行取色,发现第一个像素的RGB是(53,53,53),这里为了对应python里for的取数是从0开始的,所以把第一个像素的坐标记为(0,0)
往右则是(54,54,54),然后依次加一,最大的RGB数是67
再对左上角定位符的第一个像素的取色,其RGB是(30,30,30),该像素对应的坐标是(15,15);往右一个像素RGB是(31,31,31),坐标是(16,15)
可以看到在定位符中,前面几个像素的坐标值相加等于RGB值(15+15=30),考虑到后面的坐标值会大于67,那么进一步可以理解为 (x+y-RGB)%68的值为0,通过这个规律,正好可以使定位符修复成(0,0,0)
至此,大致可以推断出二维码修复的逻辑了,虽然无法还原代码中遮挡的部分,但是可以根据上述的逻辑尝试修改一下代码:
from PIL import Image
im=Image.open('password.png', 'r')
new = Image.new('RGB',(255,255),(255,255,255))
for y in range(255):
for x in range(255):
fd=im.getpixel((x,y))
re=(x+y-fd[0])%68
xin=Image.new('RGB',(1,1),(re,re,re))
if re==0:
new.paste(xin,(x,y))
new.show()
运行代码得到修复二维码图片
扫一下看看是不是正确结果:
得到一串字符,疑似base64加密,解码得到:
拿去解压压缩包,成功得到压缩的文件,说明二维码修复成功了。
打开flag.docx,还有一层解密
这里用到了背包加密和CBC加密,由于能力有限,后面的解题过程参考大神的wp:http://t.csdn.cn/QGx2T
再附上背包加密和CBC加密的介绍
背包加密介绍:https://www.cnblogs.com/Mar10/p/17052066.html
CBC加密介绍:带你了解CBC加密解密-腾讯云开发者社区-腾讯云