四道图片隐写题

第一题

  • 打开压缩包得到的是一张PNG格式的图片

  • 首先拖放到010Editor中:

CTRL+F 搜索IHDR发现只有一个,没有其他问题

  • 然后放到KALI中分析一波:

图片能够在kali中打开,说明不是宽高的隐写,因为如果修改了宽高在linux中是无法正常显示的

  • 然后binwalk分析一波:

同样的没有什么问题

  • 最后就是放到 stegslove里面试一试了

简单的科普一下png的知识

png支持RGBA四个通道,每个通道占8个二进制位,隐写文件或数据一般都在各个通道的低位,因为低位的变化不会引起较大的视觉变化,图片看上去还是原来的图片,但是你不知道是在哪个通道,这里有4个通道,如果藏在一个通道的低位的话,有四种可能,如果藏在两个通道的低位的话,可能进行各种运算操作后出现新的图片,加减乘除与或异或

发现Red plane 0是空的,按理来说应该也是”雪花“的,所以应该是有问题的

然后 Analyse - Data Extract,查看该通道,得知是LSB隐写

后面得知就是吧Alpha、Red、Green、Blue 0通道进行异或处理就能够得到flag了,可以通过stegslove获得,下面说一下通过python编写脚本进行色道分离异或处理的方法:

#代码参考自合天智汇
import cv2
import numpy as np
import os

def lowbit(x):

    return x & 0x1
png= cv2.imread("flag_enc.png" , cv2.IMREAD_UNCHANGED)

# 新建一个temp文件夹保存异或之后的图片
os.system("mkdir temp")
# 打开进入temp文件夹
os.system("cd temp")
for i in range(0,4):
    for f in range(0,4):
        dst= cv2.bitwise_xor(lowbit(png[: ,: ,i]),lowbit(png[: ,:, f]))
        cv2.imwrite("temp/"+"xor_"+str(i)+"_"+str(f)+".png",dst*255)
for i in range(0,4):
    for f in range(0,4):
        dst= cv2.bitwise_or(lowbit(png[: ,: ,i]),lowbit(png[: ,:, f]))
        cv2.imwrite("temp/"+"or_"+str(i)+"_"+str(f)+".png",dst*255)
for i in range(0,4):
    for f in range(0,4):
        dst= cv2.bitwise_and(lowbit(png[: ,: ,i]),lowbit(png[: ,:, f]))
        cv2.imwrite("temp/"+"and_"+str(i)+"_"+str(f)+".png",dst*255)

然后就可以得到结果,很明显能够看到flag了:

第二题

下载题目压缩包解压后得到两个文件 desc.txt 和 damaged.disk

desc.txt理面是一段英文,翻译后就是:

Horse Clip-Clop
A strange filesystem is recovered from a damaged old hard disk.

马夹子
从损坏的旧硬盘恢复奇怪的文件系统。

然后百度、Google还是看不懂,就不对这个txt文件分析了


  • 把 damaged.disk拖到010Editor中看看有什么信息

文件开头,看不懂。。。。。。

往下继续翻,CTRL+F 搜索一下 flag,key,ctf 无果(太天真了)

后面发现了PNG的文件头,终于找到关键信息

往下找发现有两个IHDR,CTRL +F 发现确实就是两个然后裁剪出来补上文件头得到两张图片

然后用PS将两张图片进行拼接,就得到flag了

第三题

下载得到一张图片,一贯的套路,拖到010Editor里面看看先

真正有东西的是后面的这部分数字和字母:

科普一下

Exif : 可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据

Exif可以附加于JPEG、TIFF、RIFF 等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。

还是binwalk分析一下看看:

没什么特别,看来flag就在这一串的数字字母结合的数据里头了,很明显看起来这是16进制的编码,Converter转换一下

得到的是一堆的坐标,然后通过坐标画图

方法一:使用KALI 的 gnuplot

百度略微了解了一下gnuplot的用法,把坐标转换成为 gnuplot 能够识别的形式,用notepad++ 的替换即可完成,保存为txt文件,然后在Kali中进入gnuplot,执行 plot "文件名",得到一张二维码:扫码即可得到falg:

flag{40fc0a979f759c8892f4dc045e28b820}

方法二:利用Python编写脚本

#代码参考自合天智汇
import cv2
import os
import numpy as np
n=0
canvas= np.ones((300, 300, 3), dtype="uint8")
canvas=canvas*255
list=open("1.txt").read().split("\n")
list=[i.split(",")for i in list]
for p in list:
    canvas[int(p[0]),int(p[1])]=[0,0,0]
    cv2.imwrite("2.jpg",canvas)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

第四题

首先已经很明确的告诉了题目的相关信息

文件格式:BMP

工具:Winhex

类型:图片隐写

文件直接无法打开,到winhex中看一看

很显然这不是bmp文件头,所以这道题目就是加个头部就可以了,最后的答案是这样的,那么找一个bmp的文件头加上去嘛

加完之后,依旧是打不开的啊???难道是覆盖原来的地方么,那再试试吧!

还是打不开,看来是我想的太简单了。。。然后找资料详细了解一下bmp文件头

BMP文件分析

BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。

BMP文件的图像深度可选1bit、4bit、8bit、16bit、24bit、32bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

数据段名称 大小(byte)
bmp文件头 14
位图信息头 40
调色板 由颜色索引数决定
位图数据 由图像尺寸决定

图像通常保存的颜色深度有:wikipedia

  • 每像素1位:支持2种不同的颜色(例如:黑色和白色)像素值存储在每个位中,也即调色板有两个;
  • 每像素2位:支持4种不同的颜色,每1字节存储4个像;
  • 每像素4位:支持16种不同的颜色,每1字节存储2个像素;
  • 每像素8位:支持256种不同的颜色,每1字节存储1个像素;
  • 每像素16位:支持65536种不同的颜色,每2字节WORD存储1个像素;
  • 每像素24位:支持16,777,216种不同颜色(真彩色),每3字节存储1个像素值,没有调色板;
  • 每像素32位:支持4,294,967,296种不同颜色,每4字节DWORD存储1个像素,没有调色板;

BMP文件头

字节(byte) 内容 (HEX)
0-1(2byte) 4D 42(固定) 表示文件类型
2-5(4byte) 表示文件的大小
6-7(2byte) 00 00(固定)保留位
8-9(2byte) 00 00(固定)保留位
a-d(4byte) 4字节的偏移,表示从文件头到位图数据的偏移

位图信息头

字节 内容(HEX)
4byte 28 00 00 00(固定)信息头的大小
4byte 宽度(以像素为单位)
4byte 高度(以像素为单位) 同时如果为正,说明位图倒立(即数据表示从图像的左下角到右上角),如果为负说明正向;
2byte 为目标设备说明颜色平面数,总被设置为1
2byte 位数/像素数,十进制值有1、2、4、8、16、24、32
4byte 说明位图数据的压类型( 00 00 00 00 表示不压缩)
4byte 说明位图数据的大小,即图像大小=文件大小-偏移量
4byte 水平分辨率
4byte 垂直分辨率
4byte 颜色索引数

调色板

不都有

题目

分析之后发现,不是所有的bmp文件头数据都是一样的,所以需要知道文件的大小,宽高才能够匹配正确的文件头

  • 在这里可以看到文件大小为 230454 byte;
  • 图像大小为 230454-54=230400 byte;
  • 那么宽高是是多少呢?
    • 这里得看位图是多少,现在常见的就是24位,每三个字节存储一个像素
    • 还有就是文件尾部看到的 00 00 00也可以得知是24位的
    • 图像大小=宽 x 高 x 3
  • 得知是 320 x 240 x 3

覆盖到文件头得到下面图片:

原文地址:https://www.cnblogs.com/CH42e/p/11980516.html

时间: 2024-08-29 07:59:25

四道图片隐写题的相关文章

CTF杂项之图片隐写、crypto

图片隐写: 1.将图片里的数据转换成二维码: 用linux下的信息提取工具Binwalk看一下: [email protected]:~/Desktop# binwalk 图片名 DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 PNG image, 1000 x 562, 8-bit/color RGBA,

记一道CTF隐写题解答过程

  0x00 前言 由于我是这几天才开始接触隐写这种东西,所以作为新手我想记录一下刚刚所学.这道CTF所需的知识点包括了图片的内容隐藏,mp3隐写,base64解密,当铺解密,可能用到的工具包括binwalk,MP3Stego等. 题目链接:http://ctf5.shiyanbar.com/stega/apple.png 0x01 试探 这几天我养成了一个习惯,拿到题目不管三七二十一先到kail上面跑一跑.一来可以多用用里面丰富的工具,二来可以拓展解题思路. 首先.命令行输入wget http

Vape Nation - IceCTF中的一道图片隐写

(一).题目介绍: 题目是一张图片,给的提示是go green题目如下图: 图片长这样的: (二).分析: 根据提示,很大很大可能与绿色有关,于是先去除绿色,发现没啥发现,如下图: 于是想到可能与绿色的最低位有关系,于是提取出来写到文本里,可能可以用来生成二维码之类的,如下: 于是把这这些值作为黑白像素生成图片,生成结果如下: (三).贴上代码: (1).去除绿色: #!/usr/bin/env python # -*- coding:utf-8 -*- from PIL import Imag

Misc杂项隐写题writeup

MISC-1 提示:if you want to find the flag, this hint may be useful: the text files within each zip consist of only "printable" ASCII characters 给了53个加密压缩包,每个包分别含有一个txt文件,首先想到暴力破解压缩包,试过各种破解工具后发现并不能用,于是想到使用脚本.以下是py脚本: 1 #coding:utf-8 2 import zipfile

隐写技巧——利用JPEG文件格式隐藏payload

0x00 前言 继续对图片隐写技巧的学习,这次是对JPEG文件格式的学习和理解.同PNG文件的格式对比,JPEG文件相对简单,读取其中隐藏payload的方式大同小异,两者区别在于文件格式不同,可供利用的细节存在差异. 本文相关工具: 16进制编辑器:Hex Editor 隐写检测:Stegdetect 下载地址: https://github.com/abeluck/stegdetect 编辑Exit信息:MagicEXIF 下载地址: http://www.magicexif.com/ 分析

F5隐写工具使用

  0x00 前言 今天在实验吧看到一个图片隐写的题目,用了stegslove和winHex分析一通发现并没有什么有效信息.看了评论区大佬的提示说用到了F5隐写工具,所以百度教程用了一下,发现确实解决了问题. 解题链接:http://www.shiyanbar.com/ctf/1938 0x01 F5下载安装 F5隐写全称F5-steganography,在kail系统命令端输入以下代码: git clone https://github.com/matthewgao/F5-steganogra

ctf中关于图片的隐写随笔(不全)

①JPG图片的结束符,十六进制常为FFD9 ②binwalk的原理是:检查常见的文件头信息,如果不符合,一定有隐藏信息.③JPG是有损压缩,PNG是无损压缩,BMP是不压缩. 隐写的基本原理:图片查看器会忽视掉结束符之后的内容,所以追加在结束符后面的内容会被隐藏起来.

信息安全之隐写图片

隐写图片 我们用记事本打开或者用notepad++打开一张jpg图片,然后在最后写下一段文字,然后发送给别人,别人也用记事本拉到最后 打开才能看到. 这是因为在jpg中,是有结束符的,16进制是FF D9,利用UE编辑器 可以看到正常的jpg结尾都是FF D9的,图片查看器会忽视jpg结束符之后的内容,所以我们附加的内容,自然也就不会影响到图像的正常显示. 我们找一张图片(这表情就是原图)在里面写入“这里是密文”,然后保存 最后我们写一个程序来给出图片地址检查出添加的密文 1 package g

android——隐写软件

趁热打铁 完成对话框选择文件之后 在其基础上写了个在图片上实现LSB隐写功能的软件 不多说 上代码下载链接 http://download.csdn.net/detail/u012409883/7840495  主界面图如下: 隐写活动界面 选择隐写图片目录对话框 提取信息活动界面