下载得到3个文件
预期解法应该是根据图片写出脚本,把混淆过的二维码恢复,我发现照着password.png也能看出原本的二维码大概长啥样
手动修复得到一张二维码
扫码得到IXE1VDYmMjk=,base64解码得到压缩包密码!q5T6&29
从password.png里面foremost分离出压缩包,解压得到文本内容如下
目前知道这是背包加密,根据师傅的提示,可以在博客给的c语言代码基础上稍加改动,这里附上Python脚本:
from gmpy2 import invertK = 1074
S = 43
inv = invert(S, K) # 求模逆元# 背包密码解密
# 这个背包是最重的物件对应每字节8bit里的第1个bit,依此类推
def unpack(num):A = [175, 87, 44, 21, 11, 5, 3, 1]res = ''for i in range(8):if num >= A[i]:# res = '1' + resres = res + '1'num -= A[i]else:# res = '0' + resres = res + '0'return int(res, 2)C = [1817, 3100, 2240, 868, 172, 1816, 2025, 50, 172, 2289, 1642, 2067, 1337, 1681, 655, 2588, 691, 2591, 1595, 1552, 2498, 1513, 609, 1075, 602, 1420, 2720, 1042, 947, 2160, 731]# 对密文直接进行背包解密
tmp = []
for i in C:tmp += [unpack(i * inv % K)]
# 由于使用了CBC模式,解密结果要异或其上一位密文或初始向量
# 明文第1位不是flag,所以从第2位开始直接异或上一位密文后8位即可
for i in range(1, len(tmp)):print(chr(tmp[i] ^ C[i-1] % 256), end = '')