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

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

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

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

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第1张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第2张图片

第四步,使用快捷键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语言实现LSB图像信息隐藏_第3张图片

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

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第4张图片

运行后如图,输出03438445

信息隐藏——使用C语言实现LSB图像信息隐藏_第5张图片

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

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

数据块的结构如下

信息隐藏——使用C语言实现LSB图像信息隐藏_第6张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第7张图片

cHRM数据块结构如下

信息隐藏——使用C语言实现LSB图像信息隐藏_第8张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第9张图片

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的格式输出,便于日后对格式进行分析

信息隐藏——使用C语言实现LSB图像信息隐藏_第10张图片

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

那么对应的代码应该为

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

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第11张图片

信息隐藏——使用C语言实现LSB图像信息隐藏_第12张图片

信息隐藏——使用C语言实现LSB图像信息隐藏_第13张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第14张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第15张图片

信息隐藏——使用C语言实现LSB图像信息隐藏_第16张图片

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

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

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第17张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第18张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第19张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第20张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第21张图片

信息隐藏——使用C语言实现LSB图像信息隐藏_第22张图片

信息隐藏——使用C语言实现LSB图像信息隐藏_第23张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第24张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第25张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第26张图片

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

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第27张图片

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

第十二步,使用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,以下为完整的代码

信息隐藏——使用C语言实现LSB图像信息隐藏_第28张图片

信息隐藏——使用C语言实现LSB图像信息隐藏_第29张图片

信息隐藏——使用C语言实现LSB图像信息隐藏_第30张图片

信息隐藏——使用C语言实现LSB图像信息隐藏_第31张图片

信息隐藏——使用C语言实现LSB图像信息隐藏_第32张图片

信息隐藏——使用C语言实现LSB图像信息隐藏_第33张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第34张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第35张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第36张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第37张图片

输入如下的指令:

信息隐藏——使用C语言实现LSB图像信息隐藏_第38张图片

逐行解释一下:

信息隐藏——使用C语言实现LSB图像信息隐藏_第39张图片

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

信息隐藏——使用C语言实现LSB图像信息隐藏_第40张图片

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

你可能感兴趣的:(java,servlet,jvm,安全,linux)