首先看一下官方定义,“隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。”
简单说就是将一种东西隐藏在另一种东西中,在现实中例如图片版权问题,就可以看似运用隐写技术将所有者的id或身份验证添加到图片中,也可以应用于核实身份
在CTF的Misc中,经常会看到关于隐写的题目
鲁棒性((robustness)
鲁棒来自于“Robust”,也可以理解为健壮性,指不因某种改动而导致隐藏信息丢失的能力。比如传输时的噪音或滤波操作、重采样、有损编码压缩等
不可检测性(undetectability)
指隐蔽载体与原始载体具有一致的特性,如具有一致的统计噪声分布等,以便使非法拦截者无法判断是否有隐蔽信息
透明性(invisibility)
利用人类视觉系统或人类听觉系统属性,经过一系列隐藏处理,使目标数据没有明显的降质现象,而隐藏的数据却无法人为地看见或听见
安全性(security)
指隐藏算法有较强的抗攻击能力,即它必须能够承受一定程度的人为攻击,而使隐藏信息不会被破坏
使用binwalk的话,使用kali,“binwalk 图片名”
binwalk中的参数
-e, --extract 自动提取已知的文件类型
-D, --dd=
-M, --matryoshka 递归扫描提取的文件
-d, --depth= 限制matyoshka递归深度(默认值:8级深度)
-C, --directory= 解压文件/文件夹到自定义目录(默认:当前工作目录)
-j, --size= 限制每个提取文件的大小
-n, --count= 限制提取文件的数量
-r, --rm 解压后删除刻录的文件
-z, --carve 从文件中提取数据,但不要执行提取实用程序
-V, --subdirs 提取到由偏移量命名的子目录中
图片类隐型经常会将一部分数据隐藏在一张图片中,判断思路可以,Jpg格式的文件在16进制中的表示是以 ff d9 两个字节结尾,可以通过判断末尾来判断是否为真正的图片文件,有时也可以通过文件的大小稍加判断
import binascii
filename = 'LIzOKZIuElF1WHKA.png'
with open(filename, 'rb') as f:
content = f.read()
print(binascii.hexlify(content).upper())
也可以使用最低有效为
最低有效位 (Least Significant Bit)
我们常说的三原色是红、黄、蓝
LSB隐写就是修改了像数中的最低的1bit,png图片是一种无损压缩的位图片形格式,png图片中的图像像数一般是由RGB三原色(红绿蓝)组成,每一种颜色占用8位,取值范围为0x00~0xFF,即有256种颜色,一共包含了256的3次方的颜色,即16777216种颜色。而人类的眼睛可以区分约1000万种不同的颜色,这就意味着人类的眼睛无法区分余下的颜色大约有6777216种
十进制的235表示的是绿色,我们修改了在二进制中的最低位,但是颜色看起来依旧没有变化,我们就可以修改最低位中的信息,实现信息的隐写
题目意思:
这是一个非常简单但非常壮观的技巧。
你能看到隐藏的解决方案吗?
注意:解决方案与您的会话 ID 绑定,由十二个字母组成。
隐藏提示:http://wechall.blogspot.com/2007/11/steganabara-explained.html
点开链接提示了工具
题目意思:
找出隐藏在我身上的那句话,否则我将不得不摧毁你。
“在为自由服务的过程中,任何牺牲都不算大。”
既然从根本开始做,那就假设我不知道这是谁,既然是饮用那就是他说出的话,搜索一下
我们知道原来它叫 Optimus Prime
第一眼竟然认成了 Option Prime
分析一定与素数有关,并且是红色为底色,之前有一道题是提图片的HSB,既然是红色,那就分析像素的R为素数尝试一下
在搜索代码的时候发现已经有大佬写出了这个代码
地址:https://www.tuziang.com/index.php/combat/1985.html
from PIL import Image
from math import sqrt
def is_prime(n):
if n==1:
return False
for i in range(2, int(sqrt(n) + 1)):
if n % i == 0:
return False
return True
img = Image.open("op.png")
width = img.size[0]
height = img.size[1]
for x in range(width):
for y in range(height):
r,g,b = img.getpixel((x,y))
if is_prime(r):
continue
else:
img.putpixel((x,y),(255,255,255))
img.show()
参考文章
https://zhuanlan.zhihu.com/p/301815967
https://blog.csdn.net/superdont/article/details/1396172?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164605916216780271951936%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164605916216780271951936&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_ulrmf~default~default-3-1396172.pc_search_insert_ulrmf&utm_term=%E4%BF%A1%E6%81%AF%E9%9A%90%E8%97%8F&spm=1018.2226.3001.4187
https://blog.csdn.net/weixin_34075268/article/details/88744599