BugkuCTF-MISC题粗心的佳佳

下载得到3个文件
在这里插入图片描述
预期解法应该是根据图片写出脚本,把混淆过的二维码恢复,我发现照着password.png也能看出原本的二维码大概长啥样
手动修复得到一张二维码

扫码得到IXE1VDYmMjk=,base64解码得到压缩包密码!q5T6&29
从password.png里面foremost分离出压缩包,解压得到文本内容如下
在这里插入图片描述
目前知道这是背包加密,根据师傅的提示,可以在博客给的c语言代码基础上稍加改动,这里附上Python脚本:

from gmpy2 import invert

K = 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' + res
            res = res + '1'
            num -= A[i]
        else:
            # res = '0' + res
            res = 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 = '')

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值