破解隐写术指南:最低有效位和基本工具
2022-9-23 20:5:41 Author: 网安之道(查看原文) 阅读量:9 收藏

当谈到破解隐写术时——就像其他夺旗挑战一样,你可以遵循一种特定的方法。虽然有无数的在线解密和加密工具,但本指南的目的是向展示如何分析文件并了解隐写术的工作原理。

在本指南中,我们将检查文件压缩和最低有效位——可以用到的工具和方法。

1. 文件和字符串 

首先,当获得图像时,第一步是启动终端并在命令行中运行“文件”以检查文件。假设它是 png 或 jpg 图像——特别注意图像的大小和图像的颜色深度——它是 8 位还是 16 位?

$ file photo.png

对于存储在图像中的可能消息的被动概览,请运行“字符串”命令并查看是否有任何感兴趣的隐藏文本。有时,可以在文件中配置有用的句子——曾经遇到过一个问题,“IV:Prince”和“Rijndael”这两个词存储在 jpg 文件中。对于那些熟悉密码学的人,会认识到 IV 代表初始化向量,而 Rijndael 是AES(一种常用的密码块算法)的创建者之一。

$ strings photo.png

通过运行这两个命令,已经进行了被动侦察,通常不会发现任何有趣的东西。但是,最好的做法是尽可能多地收集有关该文件的信息,以防万一出现任何问题。

2. Binwalk

Binwalk 是一种用于分析、逆向工程和检查文件组成的工具。用法非常简单:

$ binwalk photo.png
DECIMAL HEXADECIMAL DESCRIPTION-------------------------------------------------0 0x0 PNG image data, 10541 0x292D Zip archive data

该工具将立即分解文件的组成。正如在上面看到的,该文件包含两个隔间 - png 图像数据和一个 zip 文件。通常在这些情况下,zip 文件的提取会给你一个标志,但是在其他情况下,它是一个潘多拉的盒子,在封装中封装(文件中的文件),你必须按照该方法几次来提取最后。

要提取隐藏文件,请运行带有标志“-e”的命令来提取

文件:

$ binwalk -e photo.png

这将自动将外部文件解压缩到的当前目录中。此时,“cat”文件以打印内容,检查使用“文件”和“字符串”提取的文件类型,然后再次重复该过程。

提示:通过运行以下命令查看 hexdump,比较提取前后的文件:

$ xxd <your_decompressed_file> | less

3.Pngcheck

Pngcheck是检查任何图像损坏或看起来不合适的部分的好工具。对 png 文件的构成有一个基本的了解对很重要。通常,png 文件是在非关键数据的“块”中创建的。这些“块”类具有与该特定图像相关的特定名称和功能。

要以详细模式运行 pngcheck,请执行以下操作:

$ pngcheck -v photo.png

检查呈现的块。特别要注意以下块:

  • tEXT:存储在 ISO/IEC 8859-1 中呈现的文本

  • zTXt:压缩文本

  • iTXt:可压缩的 UTF-8 文本

  • pHYs:提供与图像的预期像素大小相关的信息

4. 最低有效位(二进制和 RGB)

图像由像素组成。每个像素都包含一个标识,通常称为 RGB。由于计算机以二进制(零和一)的形式表示数据,RGB 代码也可以以相同的方式表示。RGB 的每个值都是一个从 0 到 255 的数字。知道一个字节(由 8 位组成)最多可以存储 255 的二进制数字 – 像素的 RGB 代码以二进制格式存储,如下所示:

Pale Yellow
RGB: 200, 180, 120Hexadecimal RGB: (C8, B4, 78)Binary: 11001000, 10110100, 01111000

最低有效位原理也称为最右位原理,因为字节的最后一位值,如果翻转/改变,不会影响肉眼的图像组成。

这意味着,如果将所有这些更改的位聚合在一起并将二进制转换为 ascii - 将找到隐藏的消息。

将每个像素转换为 RGB 的一种简单方法是使用名为PIL的 Python 模块,该模块专为图像处理而设计。以下代码将图像中的每个像素转换为其各自的二进制代码(即一个字节——或每个 R、G 和 B 一个二进制数),然后仅打印出每个像素的最后一位(最低有效位)。

from PIL import Image 
im = Image.open("photo.png") pix = im.load() for i in range(width): for j in range(height): print(bin(pix[j,i][ 0])[-1] + bin(pix[j,i][1])[-1] + bin(pix[j,i][2])[-1], end='')

按照上面的代码,可以将其保存在变量中,然后将其转换为 ascii 以检索消息,而不是打印出二进制文件。

print(binascii.a2b_uu(your_string))

文章来源: http://mp.weixin.qq.com/s?__biz=MzIxMDI2ODM1OA==&mid=2651501780&idx=1&sn=dcda90b958f4d5c81e848fb0259458b7&chksm=8c992d7dbbeea46b310bac312a95ac9cf31a9781af646447fe93fe0df3b2084d3beff80fcaf7#rd
如有侵权请联系:admin#unsafe.sh