一、前言
- 首先还得感谢套神的帮助,我太菜了,有想要复现这题的文章末尾有题目分析链接
二、解题步骤
1、打开压缩包发现里面只有一张图片,一张奇怪的png图片
2.一般情况下kali三部曲,没发现啥就放入010Editor看,这题也不例外先放kali里binwalk一下
发现有东西,foremost一波带走拿到有用的东西
打开这个zip文件夹发现存在加密文件,用360压缩打开,发现还是有密码直接排除伪加密
3.那接下来的思路只能换010Editor看细节了,这里考虑到图片是PNG,可能有修改高度的问题。
用到一个工具脚本
import zlib
import struct
# 同时爆破宽度和高度
filename = 'C:/Users/Administrator/Desktop/shizhenle.png'
with open(filename, 'rb') as f:
all_b = f.read()
crc32key = int(all_b[29:33].hex(), 16)
data = bytearray(all_b[12:29])
n = 4095
for w in range(n):
width = bytearray(struct.pack('>i', w))
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
crc32result = zlib.crc32(data)
if crc32result == crc32key:
print("宽为:", end = '')
print(width, end = ' ')
print(int.from_bytes(width, byteorder='big'))
print("高为:", end = '')
print(height, end = ' ')
print(int.from_bytes(height, byteorder='big'))
#后面输出用十进制转十六进制
得到正确的宽为 1440 正确的高为1080,果然有修改,这边将03D4改为0438,拿到压缩包解密密码:
4.用密码打开压缩包得到加密脚本
从加密脚本倒数的倒数几行可以看出flag写入的位置,在ord(flag[z])+p1处当作像素r写入图片,这里我们的思路便是找到p1然后读取现在的图片中的像素r去一一减去p1再转码便能得到结果。
找p1有两种方法:
1、确定加密点直接用PS看加密处的像素(猜测在底部)底部应为黑色像素块,理因像素为(0,0,0),而以为p1,p2,p3的存在导致现在这般颜色
2、进行爆破p1的值
这里先用第一种方法,先用PS查看像素颜色得到R = 30、 G = 28、 B=8 则P1 = 30 、P2 = 28、P3 = 8
这样便可以根据原脚本进行改写,便得到了flag,主要便是确定p1的值,将最后的flag爆出来
第二种直接穷举p1得到flag
链接:https://pan.baidu.com/s/1V5UqvsJFQwdTjuMGr6bXWg
提取码:ndat