[BUGKU] [MISC] 猫片

这是一篇关于BUGKU比赛中的一道杂项题的解决过程,涉及PNG图片隐写和NTFS交换数据流的隐写技术。通过分析PNG图像的色道,发现并提取隐藏数据,经过处理得到半张二维码。然后调整二维码的宽高,成功扫描出一个链接,下载到一个包含pyc文件的压缩包。通过理解pyc文件的原理,使用在线工具解密pyc,最终编写脚本解密并得到flag。

这题是bugku从安恒那偷的,就是那个只有签到题的比赛

提示:难度与BUGKU同分数的题目相比较高,完全不是一个水平,如果是新手建议别看writeup硬啃,先做其他题吧。大佬随意

下载,发现一个文件

binwalk走一下,发现真的就是png,改后缀,发现图片是只猫

因为是没人解出来的杂项题,所以比赛才会放出hints,有了hints后题目难度大大下降了,起码有了明确的方向

拉进stegsolve

左右切一切色道,发现Blue plane 0,red plane 0和green plane 0头上都有一条,怀疑是隐写

选 analyse > Data Extract

左侧勾上Blue plane 0,red plane 0和green plane 0,右侧根据提示勾上LSB和BGR

preview一下,看到数据头,那么明显的png,保存bin,名字直接写成11.png

但是png开头是89504E47 ,这里要把多余的删去,拉进winhex,删去头上的fffe

之后就能看到png了,是半张二维码

拉进linux,crc校检报错,去改宽高,二维码是方的,所以把高写成和宽一样

之后扫描一下

https://pan.baidu.com/s/1pLT2J4f

下载下来一个压缩包,打开flag

心态炸了

看看提示,还有一个NTFS没用上

搜了一下NTFS隐写,发现了NTFS交换数据流的隐写方式

打开NtfsStreamsEditor

选择文件夹进行搜索,记得把文本文件解压出来

导出,出现了pyc文件

在网上摘抄了一段py和pyc的文章

原来Python的程序中,是把原始程序代码放在.py文件里,而Python会在执行.py文件的时候。将.py形式的程序编译成中间式文件(byte-compiled)的.pyc文件,这么做的目的就是为了加快下次执行文件的速度。

所以,在我们运行python文件的时候,就会自动首先查看是否具有.pyc文件,如果有的话,而且.py文件的修改时间和.pyc的修改时间一样,就会读取.pyc文件,否则,Python就会读原来的.py文件。

其实并不是所有的.py文件在与运行的时候都会产生.pyc文件,只有在import相应的.py文件的时候,才会生成相应的.pyc文件

接下来回到题目,可以用在线工具解密pyc

import base64


def encode():
    flag = '*************'
    ciphertext = []
    for i in range(len(flag)):
        s = chr(i ^ ord(flag[i]))
        if i % 2 == 0:
            s = ord(s) + 10
        else:
            s = ord(s) - 10
        ciphertext.append(str(s))

    return ciphertext[::-1]


ciphertext = ['96', '65', '93', '123', '91', '97', '22', '93', '70', '102',
              '94', '132', '46', '112', '64', '97', '88', '80', '82', '137',
              '90', '109', '99', '112']

这就变成了普通的算法题了。

写个解密脚本

ciphertext = ['96', '65', '93', '123', '91', '97', '22', '93', '70', '102',
              '94', '132', '46', '112', '64', '97', '88', '80', '82', '137',
              '90', '109', '99', '112']
flag = ''
ciphertext.reverse()

for i in range(len(ciphertext)):
    if i % 2 == 0:
        s = int(ciphertext[i]) - 10
    else:
        s = int(ciphertext[i]) + 10
    s = chr(i ^ s)
    flag += s

print(flag)

逻辑大概是这样,很简单就不赘述了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HjBF8dl5-1594310513220)(https://s1.ax1x.com/2020/06/30/NIVGWT.png)]


flag{Y@e_Cl3veR_C1Ever!}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值