信息隐藏——使用C语言实现LSB图像信息隐藏

信息隐藏-使用C语言实现LSB图像信息隐藏

第一步,打开网络拓扑,启动实验虚拟机。

第二步,打开实验操作机器,点击桌面上的PentestBox快捷方式进入渗透测试工具集。并输入命令hexeditor调出工具:Hex Editor。

第三步,对桌面下隐写术Images中的LSB-File文件夹中名为start.png的图片进行分析,选择文件菜单栏,找到打开文件选项

选择桌面下的隐写术Image——LSB-File文件夹下的图片,点击打开文件(O)...打开图片start.png。注:案例中所有脚本文件都位于LSB-File目录下

第四步,使用快捷键shift+右方向键即可对该图片文件的16进制字符串进行标记,并找出文件署名域的字段信息,start.png文件前面8个字节为文件署名域,其固定格式为:89 50 4e 47 0d 0a 1a 0a

解读IHDR字段中的信息。其数据块结构我们把它划分为Length、Chunk Type Code、Chunk Data、CRC四个部分。

Length:前4个字节,作为定义长度的字段,00 00 00 0D十进制为13,代表长度为13个字节

Chunk Type Code:一共4字节,用于定义数据块类型码,此处为IHDR

Chunk Data:一共有13字节,用于定义数据内容

CRC:共有4字节,对Chunk Type Code + Chunk Data做CRC32计算得出的值

即对上述中的49 48 44 52 00 00 00 1a 00 00 00 1a 08 04 00 00 00

第五步,通过编写程序对CRC算法进行验证,将其保存为CheckCRC.cpp,源代码如下

具体操作方法如下:

打开桌面上的VC6,然后在新打开的应用程序界面中选择文件—新建

可以看到如下界面,选择文件选项,然后找到“C++ Source File”,对该程序命名

将源代码输入到VC++中,然后编译执行

运行后如图,输出03438445

同文件中的CRC32校验码进行对比发现二者的值相同

第六步,下一步我们来继续在HexEditor中分析辅助数据块中的图像γ数据块——gAMA的值

数据块的结构如下

分析辅助数据块中的基色和白色度数据块——cHRM

cHRM数据块结构如下

中间的数据块还有IDAT、tEXt等就不详细进行分析了,我们着重分析一下它图像结束数据块——IEND

IEND数据块结构

Length(0)

00 00 00

Chunk Type Code

49 45 4e 44

Chunk Data

null

CRC

AE 42 60 82

固定结构,CRC的值为对Chunk Type Code作CRC32校验,如下图,我们继续使用前面编写好的CheckCRC.cpp来进行验证,仅需要修改如下截图部分的代码即可

运行得到CRC的结果为AE 42 60 82,验证结果与文件尾部的CRC值相同。

第七步,编写程序分析文件格式,这里我们需要用到的工具依然为VC6.0,下面我们来创建一个CheckPNG.cpp源码文件,便于我们更加系统的分析文件的格式。创建步骤同第五步

如下图所示,将程序按照EditPlus的格式输出,便于日后对格式进行分析

从第8字节开始,顺序来读前四字节为ChunkLength字段

那么对应的代码应该为

接下来的四个字节为ChunkName,使用printf将其打印

根据ChunkLength数据块长度值来读出完整的ChunkData,紧接着读出CRC32的值,并且与Chunk Type Code + Chunk Data所求出的CRC32校验值作对比,最后将其保存为CheckCompare.cpp,实现这一操作的完整代码如下

第八步,将C:\Users\Administrator\Desktop\隐写术Images\LSB-File\start.png复制到C:\test\下,并改名为00.png

在VC6.0中进行编译CheckCompare.cpp,然后运行编译后的程序,即可获得完整的PNG图片文件结构

可以看到与我们前面所分析的完全一致。我们通过这个程序实现对PNG文件进行格式分析,对PNG文件的数据块名词、偏移地址、数据块长度、比较预期和实际的CRC32校验码,并可以给予对批量文件进行分析,来查找出那些可能包含了恶意Payload的文件。

第九步,在前面我们提到了,这些辅助数据块的内容实际上对PNG图像的浏览是没有任何影响的,那么下面我们尝试去除PNG文件的所有辅助数据块看看图片还是否能够正常的浏览。下面的实验我们将使用Hex Editor来去除源数据中无关紧要的辅助数据块gAMA、cHRM和bKGD这一部分的内容。

操作步骤如下:首先在桌面上的PentestBox中输入hexeditor来打开软件,然后我们将下面的内容进行标记,在进行操作之前不要忘了,保存一下原版的png图片数据用于后面进行对比

使用快捷键Ctrl+x或者右键鼠标点击所选区域找到cut选项,删除辅助参数

修改完数据后,点击选项栏中的保存按钮来保存修改后的数据

下面,我们来对比修改数据的与未修改数据的PNG文件。发现文件大小发生了变化,但是不影响PNG文件的浏览。

第十步,下面我们要做的操作是通过程序来实现去除所有辅助数据块,仅保留关键信息。程序先对ChunkName作判断,并忽略非关键数据块(Ancillary Chunk)的信息,在实现该代码之前,我们需要将new,png移动到c:\test目录下,并改名为old.png,然后编译完成下面的完整代码:compress.cpp

通过VC6.0编译并执行程序Compress.cpp,结果如下

程序执行后PNG文件大小的变化,左边为原始的PNG文件大小,右边为去掉所有辅助数据块后的文件大小,且仍然可以浏览

第十一步,下面我们对经过Compress.cpp加工后的图片来手动添加payload。我们依照辅助数据块的格式来写入运行计算器程序(calc.exe)的Payload,首先我们需要通过Python来将calc.exe进行编码,将其转换为16进制形式。输入命令python,然后从binascii库中的导出ba模块用于转换,然后直接使用ba的方法:b=ba.b2a_hex(‘待转换的数据’),然后打印出b的值,操作如下

得到了calc.exe的16进制值,下面我们将其填充进辅助模块tEXt中:

对应的tEXt完整数据块结构如下

要写入的十六进制数据如下

第十二步,使用Hex Editor插入数据到C:\test\new.png中,修改之前先备份new.png为new_bak.png第十二步需要用到,如图所示,具体操作定位到预先准备插入的位置例如此处我们插入在了IEND数据块之前(00 00 00 49……)直接键入16进制的payload即可

保存后依然不会影响PNG文件的浏览。

第十三步,下面我们通过C语言脚本自动去掉PNG文件所有的辅助模块后,写入Payload数据块tEXt,并将该程序保存为AddPayload.cpp,以下为完整的代码

将文件new_bak.png改名为new.png覆盖原文件并执行编译后的代码

接下来我们需要将该文件上传到网盘或Web服务器上。实验中的Web服务器的根路径为C:\Program Files (x86)\upload-labs\WWW。

第十四步,编写powershell脚本代码以利用图片中payload,具体代码如下:url地址根据实际环境修改,如本例的win10实验机IP为172.16.1.100

为了演示实验效果,直接在本机上使用快捷键Win+R打开命令运行功能,然后输入命令powershell,打开powershell命令行

输入如下的指令:

逐行解释一下:

运行后触发如下所示的程序

这里给出的方法仅供演示,更多方法待大家自己去挖掘。

猜你喜欢

转载自blog.csdn.net/qq_48609816/article/details/125965955