Bugku ctf杂项 粗心的佳佳

下载附件,解压得到两张图片和一个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加密解密-腾讯云开发者社区-腾讯云

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值