通常做图片隐写的题,大概都是先右键查看属性,看下有没有一些特殊的信息,没有就放binwalk看下有没有隐藏什么文件,又或者直接stegsolve分析一波,这题一开始我都试了一遍,无果。但是总不能就这样放弃吧,应该还是漏了点东西。然后折腾了快一个小时,好像有点发现,
其中
R,G,B代表RGB
Alpha代表灰度
0-7的8个选择框代表其二进制值的8个位,选中代表显示该位,不选中则不显示
Row,Column表示不同的显示方式,行或列
MSB,LSB表示显示为最高位还是最低位
Bit Plane Order选择不同的颜色通道顺序
在本题中,根据提示应选择LSB,BGR以及R,G,B三通道的0位(最低位),选中后点击Preview
在RGB里都发现了这奇怪的一段,然后就试着分析一波,
打算生成一个新的图片,不过要改下文件头
打开winhex将前面的FFFE移除,
保存之后出现惊喜,看到半张二维码的图片,接下来就可以考虑改一下图片的高度
这图是280140的,那就改成280280的试试,用winhex将高度改为01 18
得出一张完整的二维码
这二维码看着不大对劲,用画图反色(ctrl+shift+i),得出正确的二维码
扫一下,发现有个百度网盘的地址。。。
下载下来是一个压缩包,
后来特意去查了下ctf隐写的各种信息,了解到还有一种ntfs文件流的东西
PS:flag.rar这个压缩文件一定要用winrar来解压才能找得到数据流。。。
.pyc文件,直接丢到这。。https://tool.lu/pyc/
下载之后写解密的脚本。。。
def decode():
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.reverse()
flag = ''
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
return flag
def main():
flag = decode()
print(flag)
if __name__ == '__main__':
main()
最后得出 flag{Y@e_Cl3veR_C1Ever!}