【CTF-MISC】图片有关

Author Avatar
白菀枯
发表:2024-07-24 22:03:16
修改:2024-07-31 20:46:49

1. 可能在图片后追加的内容

通过编辑器打开查看最后是否有附加内容

根据文件头判断有其他文件,然后可手动复制 or binwalk or foremost 分离

2. 可能是图片中的字符串

通常在图片内部出现无法自动分别的内容

当然也可以是任何不正常的内容,也可能是最后的二进制等等

还有可能是两图片间的字符串,提取出第二张图也没用(图中还经过base32编码)

3. flag可能在备注里

4. LSB隐写

可用Stegsolve工具查找

特别注意边缘的一横或一竖有异常。

甚至有些看不到,要直接预览

5. PNG长宽不协调

可能PNG图片的宽度和高度被更改,隐藏了被截取部分图片的信息

可以通过检验crc值判断是否被更改过

可以通过在线工具检查这个crc是否正确

如图,不一致说明有问题。

通过脚本爆破出正确的长宽

import zlib
import struct
import argparse
import itertools


parser = argparse.ArgumentParser()
parser.add_argument("-f", type=str, default=None, required=True,
                    help="输入同级目录下图片的名称")
args  = parser.parse_args()


bin_data = open(args.f, 'rb').read()
crc32key = zlib.crc32(bin_data[12:29]) # 计算crc
original_crc32 = int(bin_data[29:33].hex(), 16) # 原始crc


if crc32key == original_crc32: # 计算crc对比原始crc
    print('宽高没有问题!')
else:
    input_ = input("宽高被改了, 是否CRC爆破宽高? (Y/n):")
    if input_ not in ["Y", "y", ""]:
        exit()
    else:
        for i, j in itertools.product(range(4095), range(4095)): # 理论上0x FF FF FF FF,但考虑到屏幕实际/cpu,0x 0F FF就差不多了,也就是4095宽度和高度
            data = bin_data[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + bin_data[24:29]
            crc32 = zlib.crc32(data)
            if(crc32 == original_crc32): # 计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
                print(f"\nCRC32: {hex(original_crc32)}")
                print(f"宽度: {i}, hex: {hex(i)}")
                print(f"高度: {j}, hex: {hex(j)}")
                exit(0)

更改保存后重新查看图片,发现被隐藏的内容

6. 用工具将隐写的工具提取出来

  1. steghide工具

查看图片中嵌入的文件信息

steghide info 文件名

隐藏文件

steghide embed -cf 载体 -ef 要隐写的内容 [-p 密码(可忽略)]

提取文件

steghide extract -sf 文件名 [-p 密码(可忽略,有密码会再次询问)]
  1. F5-steganography

java Extract 图片的绝对路径/图片名.jpg [-p 123456]
  1. cloacked-pixel-master

python2环境

python lsb.py extract 提取的文件 提取后保存的文件 密码 


参考:CRC爆破png图片宽度和高度原理以及python代码_根据crc得出正确高度-CSDN博客

评论