蓝鲸安全ctf打卡隐写篇----第一期


1.雨中龙猫
在这里插入图片描述在这里插入图片描述
考查base64编码和图片源码隐写

在这里插入图片描述
题目给出答案格式whalectf{xxx},将whalectf进行base64编码:d2hhbGVjdGY=
notepad++打开源码搜索,发现并不能搜索到
因为base64编码过程会重新以6位分组,所以whalectf后面的字母可能会对whalectf的编码影响,所以搜索前几位d2hhbGVj
在这里插入图片描述
得到d2hhbGVjdGZ7TG
进行解密,发现并不能解码,应该是base64不完整,那么继续寻找剩余base64编码
题目还有提示最后是py,所以我们先做一个答案whalectf{aaaaaaaaaaaaaaaaaaaaaaaapy}
编码得到d2hhbGVjdGZ7YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhcHl9
(感觉题目提示有点不合适…)
同上搜索后几位得到9uZ19tYW9faXNfaGFwcHl9
拼接得到d2hhbGVjdGZ7TG9uZ19tYW9faXNfaGFwcHl9
base64解码得到flag:whalectf{Long_mao_is_happy}
2.鲸鱼日记
在这里插入图片描述
在这里插入图片描述
提示提示可能会有文件绑定
通过命令binwalk分析图片
binwalk whalediary.jpg
在这里插入图片描述
发现文件中除了图片还有别的文件
然后通过foremost分解文件: foremost whalediary.jpg -o 1
1位指定文件夹
在这里插入图片描述
打开是一个word文档,但是搜索答案格式whale没有搜到
然后全选右键字体
在这里插入图片描述
点击“隐藏”为空,确定之后发现每个结尾多出来一个字符.
在这里插入图片描述
拼接得到flag: whale{lovesea}
ps:

  • 文件绑定原理:文件存储于计算机系统中,是不会完全将每一个字节填满的,而总会预留一部分空间。例如JPEG图片文件头就会有部分空隙,如果在标记码之间插入隐写数据,不会影响图片正常打开。
  • word常见的隐写有使用白底白字,或者隐藏属性。(白纸白字可以全选使字体颜色变黑)

3.追加数据
在这里插入图片描述
在这里插入图片描述使用pngcheck检查图片的IDAT位
在这里插入图片描述
发现第一个IDAT块的长度大于65524,但后面还有一个长度为193的IDAT块,判断flag存在193的IDAT块中。
用winhex打开图片文件
根据pngcheck结果找出0x17345位置的IDAT块
在这里插入图片描述将长度193的数据提取出来,以十六进制复制
在这里插入图片描述
获取到的数据是通过zlib方式压缩的不可读数据,所以用下面脚本解压,

#codong:utf-8
import zlib
import binascii
IDAT='789CA552B911C3300C5B09D87FB99C65E2A11A17915328FC8487C0C7E17BCEF57CCFAFA27CAB749B8A8E3E754C4C15EF25F934CDFF9DD7C0D413EB7D9E18D16F15D2EB0B2BF1D44C6AE6CAB1664F11933436A9D0D8AA6B5A2D09BA785E58EC8AB264111C0330A148170B90DA0E582CF388073676D2022C50CA86B63175A3FD26AE1ECDF2C658D148E0391591C9916A795432FBDDF27F6D2B71476C6C361C052FAA846A91B22C76A25878681B7EA904A950E28887562FDBC59AF6DFF901E0DBC1AB'.decode('hex')
result = binascii.hexlify(zlib.decompress(IDAT))
bin = result.decode('hex')
print bin
print '\r\n'
print len(bin)

得到
在这里插入图片描述
结果为一堆二进制数据,长度为1024
1024正好为32的平方,所以这可能是一个二维码.
把01数据放到result.txt中,用脚本生成二维码

# python2 
#! /usr/bin/env python
from PIL import Image
MAX = 32
pic = Image.new('RGB',(MAX*9,MAX*9))
f = open('result.txt','r')
str = f.read()
i = 0
for y in range(0,MAX*9,9):
    for x in range(0,MAX*9,9):
        if(str[i] == '1'):
             for n in range(9):
                 for j in range(9):
                      pic.putpixel([x+j,y+n],(0,0,0))
        else:
             for k in range(9):
                  for l in range(9):
                      pic.putpixel([x+l,y+k],(255,255,255))
        i = i+1

pic.show()
pic.save("flag.png")
f.close()

扫描二维码得到flag
在这里插入图片描述
ps:

  • PNG的隐写一般有两种:IHDR位得修改和IDAT块的隐写
  • PNG的IDAT块保存一般有两种:将所有数据存放到一个IDAT块中,将数据分成等长的块后存储到连续的IDAT块中。第一种会看到一个很大的IDAT块,而且整张图片只有一块,第二种一般规定长度为65524,有很多块。
  • 如果第二种,最后一个IDAT块没有到65524,而继续开始下一个IDAT块,那么可能人为添加了数据。

4.破碎的心

在这里插入图片描述在这里插入图片描述
有一张不完整的条形码
因为条形码中间并没有完全断裂,所以可以直接恢复
用画图打开条形码,使用矩形选择工具,选择一部分完整连续的块,按住Ctrl键在点击上下方向键慢慢使残缺部分恢复
在这里插入图片描述重复动作补全条形码
在这里插入图片描述打开bctester识别
在这里插入图片描述得到flag

5.我们不一样

在这里插入图片描述在这里插入图片描述
首先binwalk分析图片
在这里插入图片描述
发现有两张图片,用foremost命令将其分解
在这里插入图片描述

解后用compare命令比较两张图片的不同

在这里插入图片描述在这里插入图片描述
compare命令对比后,相同部分会使用模糊表示,不同地方使用红色表示。
放大后可以看到左下角有红线,
在这里插入图片描述
然后通过python的image库将两张图片对比后不同的像素打印出来。

# python2
#coding:utf-8

from PIL import Image
import random

img1 = Image.open("00000000.png")
im1 = img1.load()

img2 = Image.open("00006909.png")
im2 = img2.load()


a=''
i=0
s=''

for y in range(img1.size[1]):
    for x in range(img1.size[0]):
        if(im1[x,y]!=im2[x,y]):
            print(im1[x,y],im2[x,y])
            if i == 8:
                s=s+chr(int(a,2))
                a=''
                i=0

            a=a+str(im2[x,y][2])
            i=i+1
s=s+'}'
print(s)

在这里插入图片描述
发现rgb中b通道第二张变成了01二进制,将二进制数字8个为一组转换成字符,得到flag
上面脚本直接得到flag

在这里插入图片描述6.黑白打字机

在这里插入图片描述在这里插入图片描述
这是反色后的二维码,打开画图工具将反色操作
当然也可以直接用工具扫描二维码…
在这里插入图片描述
提示“你会五笔码”

图片名字为yhpargonagets
反过来是steganography,像一个单词。
百度一下,这是个工具…
利用该工具对图片解密
在这里插入图片描述
发现一堆乱码,应该是被加密了
点击Decrypt解密操作
在这里插入图片描述
发现需要密码
根据二维码内容:你会五笔码
查询这5个汉字的五笔编码
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述拼接得到wqiywfcugghgttfnkcg
输入密码框
在这里插入图片描述
得到flag:venusctf{V3nus_St3gan0graph1_1s_g00d}

发布了4 篇原创文章 · 获赞 3 · 访问量 236

猜你喜欢

转载自blog.csdn.net/x519461623/article/details/104382495
今日推荐