隐写术技术深入分析

0x01 隐写术概要

首先看一下官方定义,“隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。”

简单说就是将一种东西隐藏在另一种东西中,在现实中例如图片版权问题,就可以看似运用隐写技术将所有者的id或身份验证添加到图片中,也可以应用于核实身份

在CTF的Misc中,经常会看到关于隐写的题目

0x02 特征

  1. 鲁棒性((robustness)
    鲁棒来自于“Robust”,也可以理解为健壮性,指不因某种改动而导致隐藏信息丢失的能力。比如传输时的噪音或滤波操作、重采样、有损编码压缩等

  2. 不可检测性(undetectability)
    指隐蔽载体与原始载体具有一致的特性,如具有一致的统计噪声分布等,以便使非法拦截者无法判断是否有隐蔽信息

  3. 透明性(invisibility)
    利用人类视觉系统或人类听觉系统属性,经过一系列隐藏处理,使目标数据没有明显的降质现象,而隐藏的数据却无法人为地看见或听见

  4. 安全性(security)
    指隐藏算法有较强的抗攻击能力,即它必须能够承受一定程度的人为攻击,而使隐藏信息不会被破坏

0x03 隐写术应用

  1. 可以隐藏互联网上涉及敏感信息的交谈内容
  2. 在发送方发送的内容中添加水印等识别所有者的信息,属于不可抵赖性
  3. 可以在数据传输中保证数据的完整性

0x04 题目解析思路

使用binwalk的话,使用kali,“binwalk 图片名”

binwalk中的参数
-e, --extract 自动提取已知的文件类型
-D, --dd=<type[:ext[:cmd]]> 提取签名(正则表达式),给文件一个扩展名,然后执行
-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
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lmn_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值