介绍
在本文中,我将演示如何使用 Python 将 shellcode 有效负载隐藏在图像文件中,并使用 C/C++ 检索它。我将使用PNG 文件作为示例。
PNG 文件使用IEND 块来标记图像数据的结束。此块后附加的任何字节都不会影响文件的完整性或外观,因此可以隐藏有效载荷。
该技术还可以适用于具有类似“文件结束”标记的其他文件格式。
观看下面的视频,快速了解该项目。要深入了解详细信息,请向下滚动到目录。
cat payload.bin >> image.png
这会将有效载荷的字节附加到图像文件的末尾。但是,我想要一个使用 Python 的跨平台解决方案,所以我编写了一个名为的脚本payload-embedder.py。
您可以在这里查看:
payload-embedder.py - https://github.com/WafflesExploits/hide-payload-in-images/blob/main/code/payload-embedder.py
使用此脚本,您可以轻松地将 shellcode 嵌入到图像文件中,如下所示:
正如预期的那样,结果embedded.png看起来与原始图像完全相同:
如果您想在实践中使用它,您可以将加密的 shellcode 隐藏在图像文件中,然后在需要时提取它。
有两种方法可以检索有效载荷:
从磁盘:将图像文件存储在磁盘上并直接从文件中提取有效载荷字节。
从资源部分(.rsrc):将图像文件存储在二进制文件的资源部分,并从那里提取有效负载。
使用 C/C++ 从磁盘上的图像文件中提取有效载荷
一旦我们将有效载荷嵌入到图像文件中,下一步就是提取它。以下用C/C++编写的代码演示了如何从存储在磁盘上的图像文件末尾检索有效载荷字节。
此程序假设您知道原始图像文件的大小。通过比较修改后的图像文件(包含有效载荷)的大小和原始大小,我们可以确定有效载荷的确切位置和大小。
你可以在我的GitHub上查看代码:
从文件中提取有效载荷.cpp - https://github.com/WafflesExploits/hide-payload-in-images/blob/main/code/payload-extractor/payload-extractor-from-file/payload-extractor-from-file.cpp
此代码分为两个主要部分:
代码中的常量
有效载荷提取
执行有效负载
代码中的常量
在运行代码之前,需要配置两个常量:
1.原始文件大小(ORIGINAL_FILE_SIZE):
将有效载荷嵌入到图像文件时,您可以从Python 脚本 的输出中获取原始文件大小。payload-embedder.py
该值表示附加有效载荷之前图像文件的大小。
2.目标文件路径(TARGET_FILE_PATH):
此常数指定包含隐藏有效载荷的修改后的图像文件的路径。
有效载荷提取
提取过程由函数处理extract_payload()。下面逐步介绍其工作原理:
1.检索文件大小:
该函数调用get_file_size()以获取目标图像文件的大小。这有助于验证有效载荷是否存在,并为我们提供文件的总大小。
2.计算有效载荷大小:
有效载荷的大小是通过从修改后的文件大小中减去原始文件大小来确定的。
3.寻找有效载荷位置:
使用fseek,程序将文件指针移动到有效载荷开始的位置,即原始图像数据之后。
4.读取有效载荷:
使用 将有效载荷字节读入动态分配的缓冲区fread()。这确保我们将提取的有效载荷存储在内存中以供进一步使用。
执行有效负载
执行过程由函数处理ExecutePayloadViaCallback(),该函数执行以下步骤:
1.分配可执行内存:
该程序用于VirtualAlloc分配一个可读且可执行的内存块。该内存将存储有效载荷(shellcode)。
2.复制有效载荷:
使用 将提取的有效载荷复制到分配的内存中memcpy。
3.执行有效负载:
该SetTimerAPI 用于通过回调函数执行有效载荷。这种方法对于执行 shellcode 来说干净而有效
您可以在此处查看 aahmad097 执行有效载荷的回调函数列表:
aahmad097/AlternativeShellcodeExec
4.释放分配的内存:
执行后,为有效载荷分配的内存将被释放,VirtualFree以防止内存泄漏。
将图像文件存储在二进制文件的资源部分 (.rsrc) 中
在本节中,我将向您展示如何使用 Visual Studio 将图像文件(或任何有效载荷)嵌入到二进制文件的资源部分 (.rsrc)。我还将解释如何查找图像文件的资源 ID和资源类型,这对于稍后以编程方式访问和提取有效载荷至关重要。
如何将图像文件存储在.rsrc 部分。
查找资源文件 ID 和类型
如何在.rsrc部分中存储图像文件。
按照以下步骤将图像文件嵌入资源部分:
1.在 Visual Studio 中,右键单击'Resource files'。
2.单击Add > New > Show all Templates项目。
3.前往'Resource',然后选择'Resource File .rc'。
4.这将生成一个新的侧边栏Resource View。
5.右键单击该.rc文件(Resource.rc是默认名称)。
6.选择该'Add Resource'选项。
7.点击'Import'。
8.选择嵌入的图像文件:
9.您应该会看到一个代表您的图像文件的新文件
在这种情况下,IDB_PNG1是我的图像文件的资源名称。
查找资源文件 ID 和类型
要通过代码访问您的图像文件,您需要找到其资源 ID 和类型。
要以编程方式访问图像文件,您需要两条关键信息:
资源 ID
资源类型
要查找资源 ID,您需要:
1.资源 ID被定义为以图像文件的资源名称命名的宏。
2.此宏位于resource.h文件中。打开resource.h即可查看资源 ID:
就我而言,图像文件的资源名称是IDB_PNG1。
要查找资源类型,您需要:
1.转到您的项目并打开Solution Explorer窗口。
2.右键单击Resource.rc,选择Open with...,然后选择C++ Source Code Editor (with Encoding)。
3.打开选项卡后Resource.rc,按打开即可按图像文件的资源名称进行搜索CTRL+F。
4.您应该在资源名称后看到图像文件的资源类型,如下所示:
从资源部分(.rsrc)的图像文件中提取有效负载
将修改后的图像文件(包含有效载荷)存储到二进制文件的资源部分后,下一步是提取并执行它。下面用C/C++编写的代码演示了如何实现这一点。
此代码的工作原理与上一个从磁盘上的图像文件中提取有效载荷的示例类似。关键区别在于有效载荷提取,它直接从资源部分而不是文件中检索有效载荷。
你可以在我的GitHub上查看代码:
从资源中提取有效载荷.cpp - https://github.com/WafflesExploits/hide-payload-in-images/blob/main/code/payload-extractor/payload-extractor-from-resource/payload-extractor-from-resource.cpp
此代码分为两个主要部分:
代码中的常量
有效载荷提取
执行有效负载
这部分与从磁盘上的图像文件中提取有效载荷相同。如果您想了解更多信息,请访问使用 C/C++ 从磁盘上的图像文件中提取有效载荷部分。
代码中的常量
在运行代码之前,需要设置三个常量:
1原始文件大小(ORIGINAL_FILE_SIZE):
当您将有效载荷嵌入到图像文件中时,您可以从Python 脚本 的输出中获取原始文件大小。payload-embedder.py
该值表示附加有效载荷之前的原始图像的确切大小。
2.资源 ID ( PAYLOAD_RESOURCE_ID):
资源 ID 标识资源部分中嵌入的图像文件。
要查找该值,请参阅查找资源文件 ID 和类型部分。
3.资源类型(PAYLOAD_RESOURCE_TYPE):
资源类型指定资源的类型(例如PNG)。
这也可以在查找资源文件 ID 和类型部分中找到。
有效载荷提取
该extract_payload_from_resource()函数负责直接从二进制资源中检索隐藏的有效负载。
以下是其具体操作步骤:
1.查找资源:
该函数用于通过资源的ID(例如)和类型(例如)FindResourceW()来定位资源。IDB_PNG1PNG
2.加载并锁定资源:
LoadResource()将资源加载到内存中,并LockResource()锁定它以确保安全访问其数据。
3.计算有效载荷大小:
总资源大小使用 来确定SizeofResource()。
然后通过从总资源大小中减去原始文件大小来计算有效负载大小。
4.提取有效负载字节:
使用memcpy,该函数从原始文件结束的偏移量开始提取有效载荷字节。
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里