目录

  • 前言
  • 理论
    • 像素通道
    • Pillow库
    • LSB隐写
    • 代码
    • 验证-读取数据
  • 实战
    • 杭州师范大学第四届网络与信息安全竞赛-Misc-babyLSB
    • 代码
    • 收尾
  • 总结

前言

今天要做的事情还挺多的,主要是前几天各种比赛、训练,然后就落下了一堆题目要补,还有每周的作业,哎不说了,加油干吧。

这是CTF系列的第一篇,我会记录一些日常做题的所见所闻。这一篇要介绍的是Misc中的图片LSB隐写题目,并编写一份python脚本。


理论

像素通道

每张图片都是由像素组成,每张图片中都含有许多像素点,这些像素点处存储这这张图片在这一点应显示的颜色,这个颜色的表示方法由图片使用的模式决定。常见的图像模式有RGB、HSV、CMYK、灰度模式、位图模式…

每张图片都是由一个或者多个数据通道构成。以RGB图像为例,每张图片都是由三个数据通道构成,分别为R、G和B通道。对于RGBA图片,分别有R、G、B、A四个通道,而对于灰度图像,则只有一个通道。


Pillow库

我们可以使用python中的Pillow库来实现对图片的自动化操作。对于简单的图片操作,我们只需要学会一些简单的语句或函数即可:

# 从Pillow库导入Image类
from PIL import Image# 读取本地文件名为picture.png的图片
img = Image.open('picture.png')# size 记录了图片的宽、高,单位为像素(px)
width, height = img.size
print(width, height) # 256 256# mode 属性记录了图片使用的图片模式
mode = img.mode
print(img.mode) # RGBA# getpixel()方法接受一个元组,元组中为要获取像素信息的像素点坐标
# PIL使用笛卡尔像素坐标系统,坐标(0,0)位于左上角
# X轴是从左到右增长的,Y轴是从上到下增长, 可以自己上手试试.
x, y = 100, 100
pix = img.getpixel((x, y))
print(pix) # (1, 67, 145, 235)# 也可以使用load方法,该方法返回所有像素点的信息
pix = img.load()
print(pix[x, y]) # (1, 67, 145, 235)

LSB隐写

摘自CTFwiki的介绍:

LSB 全称 Least Significant Bit,最低有效位。PNG 文件中的图像像数一般是由 RGB 三原色(红绿蓝)组成,每一种颜色占用 8 位,取值范围为 0x000xFF,即有 256 种颜色,一共包含了 256 的 3 次方的颜色,即 16777216 种颜色。

而人类的眼睛可以区分约 1000 万种不同的颜色,意味着人类的眼睛无法区分余下的颜色大约有 6777216 种。

LSB 隐写就是修改 RGB 颜色分量的最低二进制位(LSB),每个颜色会有 8 bit,LSB 隐写就是修改了像数中的最低的 1 bit,而人类的眼睛不会注意到这前后的变化,每个像素可以携带 3 比特的信息。

也就是说,我们可以把信息隐藏在像素点通道的最低位,以达到肉眼无法辨别地隐藏数据的目的。

下面给出一个例子:

  • 题外话,直接跳过好了

    这是从网上(Pexels.com)找的壁纸,我平时很少换壁纸,也很少看这些风景,找图片的时候觉得很好看。我自己本身就是很宅的,假期很少出门,更别说出去旅游了,也是几乎很少,但是还是想以后有机会出去看看。希望什么时候,实现了人生各种自由,能够没有负担地去游山玩水吧。

那么好,我们已经有了一张图片作为掩护了,我们要隐藏什么数据好呢?其实选择什么数据都可以,图片、视频、文本、压缩包,各种各样的数据都可以。这里我们选择一段文本作为演示吧

You smiled and talked to me of nothing and I felt that for this I had been waiting long.
—Rabindranath Tagore


代码

接下来是python代码,相应的地方我已给出注释:

# 导入库
from PIL import Image# 定义函数,传入图片和要隐写的内容(以bytes形式),返回隐写后的图片
def lsbForString(img, secret):index = 0 # 记录当前正在操作的比特位pixels = img.load() # 获取img的所有像素信息width, height = img.sizefor y in range(height):  # 行for x in range(width):  # 列px = list(pixels[x, y]) # 取得img在(x, y)处的颜色,格式为(R, G, B, A)的元组for i in range(4): # 分别对该像素每一个通道进行操作if index < len(secret) * 8: # 判断secret的内容是不是都藏好了px[i] = (px[i]//2) * 2 + ((secret[index // 8] >> (index % 8)) & 1) # 位运算,我写得很拙劣,不过能用index += 1 # 这一位已经藏好了,索引加一else:return img # 如果secret已经都读取过了,那么直接返回就好img.putpixel((x, y), tuple(px)) # 用隐写过的像素覆盖原来的return img# 读取要隐写的图片
img = Image.open('pexels.png')# 要隐写的内容,变量名改了一下,为了过CSDN检测
sec_ret = "You smiled and talked to me of nothing and I felt that for this I had been waiting long.--Rabindranath Tagore"# 把字符串格式转换成bytes,如果是图片、音视频等内容也可以这么隐写,有兴趣可以自己试一试
secret_byte = sec_ret.encode()# 执行隐写过程
img = lsbForString(img, secret_byte)img.show() # 临时打开图片,预览一下
img.save('result.png') # 保存图片

执行代码后,生成result.png,这个就是已经隐写过的图片啦

发现跟原图几乎没有区别,我是看不出来了。


验证-读取数据

CTF题目中,遇到LSB隐写类题目,有时需要编写脚本解密,有时只需要使用大佬们写好的工具即可。那么我们使用工具来验证一下隐写是否成功吧。

这里我们在kali中使用zsteg工具,它可以枚举所有的通道组合,把可能有意义的数据输出。直接使用命令zsteg 文件名,就能看到结果了:

可以看到,我们的文本成功藏进了图片里,并且对查看图片本身并没有什么影响。


实战

现在我们已经了解了LSB隐写技术的大致过程和原理了,用一道Misc题目来训练一下吧!

杭州师范大学第四届网络与信息安全竞赛-Misc-babyLSB

题目附件是一张图片,下载附件解压即可得到

  1. 根据题目名称猜测为LSB隐写,使用windows下的stegsolve尝试:

  1. 发现Red0, Red1, Green2, Blue3, Alpha2通道下,图片最上方都有异常数据,想办法进行提取
  2. 看到文件名提示与题目hint:两个像素一组,因而编写脚本解密

大致过程是,每次取两个像素,第一个像素提取R0,G2,R1通道,第二个像素提取G2,A2,B3通道,拼接


代码

from PIL import Image
from Crypto.Util.number import *img = Image.open('R0G2R1G2A2B3.png')
width, height = img.sizeflag = ''
for y in range(height):  # 行for x in range(0, width, 2):  # 列pix1 = img.getpixel((x, y))pix2 = img.getpixel((x + 1, y))flag += str(pix1[0] >> 0 & 1) + str(pix1[1] >> 2 & 1) + str(pix1[0] >> 1 & 1) + \str(pix2[1] >> 2 & 1) + str(pix2[3] >> 2 & 1) + str(pix2[2] >> 3 & 1)# 上面这句意思是把这些通道提取出来0或1,然后拼接成字符串,加到flag上print(long_to_bytes(int(flag, 2)))

输出如下:

至此数据提取完成


收尾

剩下的不是LSB隐写的内容了,Misc题目常规操作,看到PK34,意识到这是一个zip压缩包,保存到文件中就好了:

with open('flag.zip', 'wb') as fwb:fwb.write(long_to_bytes(int(flag, 2)))

打开压缩包得到flag


总结

也没啥好总结的,基本上都在上面了,最主要就是知道考的是LSB,并且知道题目是如何组合各种通道的,编写脚本就多练多做题好了,很快就熟练起来了。

[CTF-Misc]LSB隐写-隐藏在图片中的秘密相关推荐

  1. CTF MISC图片隐写简单题学习思路总结(持续更新)

    系列文章目录 第一篇文章: CTF Crypto简单题学习思路总结(持续更新) 文章目录 系列文章目录 前言 一.JPG类隐写 1.1 JPG文件末尾添加字符串 1.2 JPG文件中添加字符串 1.3 ...

  2. ctf misc 图片隐写(所见非真)

    第一次写misc题目走好多坑记录一下解题思路了(坑多) 得到题目 一个压缩包还有一个照片  用Winhex打开它 在文件的最后发现了flag.txt,要把它提取出来 把该图片文件拉入kali的主文件夹 ...

  3. 【信息隐藏】LSB隐写算法的实现与性能分析

    LSB隐写算法的实现与性能分析 Presented by R.G. 本项目所有的代码文件均可以在我的Github上找到,建议运行我git仓库里的代码文件,不要直接复制本文展示的代码跑 项目地址:htt ...

  4. buuctf(misc) FLAG [LSB隐写]

    用stegSolve 打开是LSB隐写 保存为bin 用解压软件打开 将其用IDA打开 hctf{dd0gf4c3tok3yb0ard4g41n~~~}

  5. 隐写术浅谈(二):LSB隐写与IDAT隐写

    Misc 学习(番外篇) - 隐写分析:隐写术(2) 在本系列的其他文章中,我主要讲了讲自己对于隐写分析的一些浅薄理解,但是大都是针对于如何反隐写(做题嘛,不寒碜),基本上很少讲如何去隐写.上一篇我们 ...

  6. 浅谈LSB隐写解题与出题

    点击"蓝字"关注,获取更多技术内容! 前言:LSB隐写在CTF中属于出现得比较多的类型.这篇文章对LSB隐写的原理,解题方法,出题脚本,以及LSB隐写特性进行研究. LSB隐写原理 ...

  7. LSB隐写(最低有效位隐写)

    LSB隐写(最低有效位隐写) 我们先思考如下几个问题,然后再去实现 1.图片在计算机中存储的方式 2.什么原因可以是实现隐写 3.为什么选择最低有效位? 4.具体实现思路 5.如果用代码实现LSB隐写 ...

  8. 图片LSB隐写(java)

    一.隐写原理 LSB隐写原理就是图片中的像素一般是由三种颜色组成,即三原色(红绿蓝).由这三种原色可以组成其他各种颜色,在png图片的存储中,每个颜色占有8bit,即有256种颜色,一共包含256的三 ...

  9. MISC 入门隐写之用眼睛去倾听

    MISC 入门隐写之用眼睛去倾听 使用工具Audacity pc直接下载windows版本即可,安装只需要选择安装目录,其他均点下一步即可完成安装. 题目:MISC入门 点击链接下载题目,得到flag ...

最新文章

  1. php 订单取消,php – 当订单状态从挂起更改为已取消时发送电子邮件通知
  2. 【转】图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵
  3. 10 3 java_10.3 UiPath如何调用Java
  4. 在著名出版社出版书,你也行——记录我写书出版的经历和体会
  5. sev2008安装mysql_数据库教程
  6. 青龙面板 抖音极速版
  7. GCN学习:用PyG实现自定义layers的GCN网络及训练(五)
  8. 数据库进阶(1)——MySQL架构(1)
  9. 概括TTL、RS32、RS485特点及区别
  10. 机器学习中的数据级联:被低估的数据,被高估的模型
  11. NoteExpress引用文献出现ADDIN NE.Ref.
  12. 理解时间序列的平稳性
  13. 有什么方法判断网站后台是用什么语言写的
  14. 老师助手为什么总是服务器错误,【家长助手】孩子在校总犯错 解决内因最关键...
  15. web在网页中引用字体包(.ttf)嵌入特殊字体
  16. vulnhub靶场,FirstBlood
  17. Python基础-类变量和实例变量
  18. 程序无法运行-报0xc000007d错误解决方法
  19. Spring事务与事务传播机制
  20. 警惕!恐吓邮件泛滥,CAC安全中心过滤超400万封

热门文章

  1. UE4材质节点笔记——钳制节点Saturate
  2. java Unsafe获取实例详细解析
  3. matlab的repmat()
  4. 贪心算法——找零钱问题
  5. 关于Html中文乱码的问题
  6. stp实验心得_通信实验心得体会
  7. IDEA中web项目拒绝连接
  8. Android 类似Ios的时间滚轮控件
  9. Lire-0.9.4-beta1初始化DocumentBuilder出错
  10. 走近 WebAssembly 之调试大法