在图像文件中隐藏 Shellcode 载荷:使用 Python 和 C/C++ 实现

admin 2024年12月28日12:13:08评论10 views字数 4335阅读14分27秒阅读模式

Concealing Payloads Hiding Shellcode in Image Files with Python and CC++

引言

在本文中,我将演示如何使用 Python 在图像文件中隐藏 shellcode 载荷,并使用 C/C++ 提取它。我将以PNG 文件为例进行说明。

PNG 文件使用IEND 数据块来标记图像数据的结束。在此数据块之后添加的任何字节都不会影响文件的完整性或视觉外观,这使得隐藏载荷成为可能。

这种技术利用了文件结束标记,使得数据可以隐藏在任何具有类似结构的图像格式中,而不仅仅是 PNG 文件。

通过这种方法,您可以隐藏加密的 shellcode 以实现隐秘的载荷执行,或秘密存储敏感信息(如密码列表),而不会改变图像的外观。

这种方法使绕过安全工具变得更容易,也使钓鱼活动更难被检测到。

请观看下面的视频,快速了解该项目的演示。要深入了解详细信息,请滚动到目录部分。

如果您想查看 GitHub 仓库,可以访问以下链接:

https://github.com/WafflesExploits/hide-payload-in-images[1]

目录

  • 引言
    • 目录
  • 支持
  • 通过在末尾附加数据在图像文件中隐藏载荷
  • 使用 C/C++ 从磁盘上的图像文件中提取载荷
    • 代码中的常量
    • 载荷提取
    • 执行载荷
  • 将图像文件存储在二进制文件的资源段 (.rsrc) 中
    • 查找资源 ID 需要:
    • 查找资源类型需要:
    • 如何在.rsrc段中存储图像文件
    • 查找资源文件 ID 和类型
  • 从资源段 (.rsrc) 中的图像文件提取载荷
    • 代码中的常量
    • 载荷提取

通过在末尾附加数据在图像文件中隐藏载荷

如前所述,PNG 文件使用IEND 数据块来标记图像数据的结束。在此数据块之后附加的任何字节都不会影响图像的完整性或视觉外观,这使其成为隐藏载荷的理想位置。

cat payload.bin >> image.png

这种方法会将载荷的字节追加到图像文件的末尾。然而,我想要一个跨平台的 Python 解决方案,所以我编写了一个名为**payload-embedder.py**的脚本。

您可以在这里查看:

  • payload-embedder.py[2]

使用这个脚本,您可以轻松地将 shellcode 嵌入到图像文件中,如下所示:

在图像文件中隐藏 Shellcode 载荷:使用 Python 和 C/C++ 实现

正如预期的那样,生成的embedded.png看起来与原始图像完全相同:

在图像文件中隐藏 Shellcode 载荷:使用 Python 和 C/C++ 实现

在实际应用中,您可以在图像文件中隐藏加密的 shellcode,并在需要时提取它。

两种方法可以检索载荷:

  1. 从磁盘:将图像文件存储在磁盘上并直接从文件中提取载荷字节。
  2. 从资源段 (.rsrc):将图像文件存储在二进制文件的资源段中。

一旦我们将载荷嵌入到图像文件中,下一步就是提取它。以下用**C/C++**编写的代码演示了如何从存储在磁盘上的图像文件末尾检索载荷字节。

该程序假设您知道原始图像文件的大小。通过比较修改后的图像文件(带有载荷)的大小和原始大小,我们可以确定载荷的确切位置和大小。

您可以在我的 GitHub 上查看代码:

  • payload-extractor-from-file.cpp[3]

这段代码分为三个主要部分:

  1. 代码中的常量
  2. 载荷提取
  3. 执行载荷

代码中的常量

在运行代码之前,您需要配置两个常量:

  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. 执行载荷:
    • aahmad097/AlternativeShellcodeExec[4]
    • 使用SetTimer API 通过回调函数执行载荷。这种方法是执行 shellcode 的一种干净有效的方式。
    • 您可以在这里查看 aahmad097 提供的载荷执行回调函数列表:
  4. 释放分配的内存:
    • 执行后,使用VirtualFree释放为载荷分配的内存,以防止内存泄漏。

将图像文件存储在二进制文件的资源段 (.rsrc) 中

在本节中,我将向您展示如何使用 Visual Studio 将图像文件(或任何载荷)嵌入到二进制文件的资源段 (.rsrc)中。我还将解释如何找到图像文件的资源 ID资源类型,这些对于以后以编程方式访问和提取载荷是必需的。

  1. 如何在.rsrc 段中存储图像文件
  2. 查找资源文件 ID 和类型

如何在.rsrc段中存储图像文件

按照以下步骤将图像文件嵌入到资源段中:

  1. 在 Visual Studio 中,右键点击'Resource files'
  2. 点击Add > New > Show all Templates项。
  3. 在图像文件中隐藏 Shellcode 载荷:使用 Python 和 C/C++ 实现
    转到'Resource',选择'Resource File .rc'
  4. 这将生成一个新的侧边栏,即Resource View
  5. 右键点击.rc文件(默认名称为Resource.rc)。
  6. 选择'Add Resource'选项。
  7. 在图像文件中隐藏 Shellcode 载荷:使用 Python 和 C/C++ 实现
    点击'Import'
  8. 选择您的嵌入式图像文件:
  9. 在图像文件中隐藏 Shellcode 载荷:使用 Python 和 C/C++ 实现
    您应该看到一个代表您图像文件的新文件。
    • 在图像文件中隐藏 Shellcode 载荷:使用 Python 和 C/C++ 实现
      在这种情况下,IDB_PNG1是我的图像文件的资源名称。

查找资源文件 ID 和类型

要通过代码访问您的图像文件,您需要找到它的资源 ID 和类型。

要以编程方式访问图像文件,您需要两个关键信息:

  1. 资源 ID
  2. 资源类型

查找资源 ID 需要

  1. 资源 ID被定义为以您图像文件资源名称命名的宏。
  2. 这个宏位于resource.h文件中。打开resource.h查看资源 ID:
    • 在我的例子中,图像文件的资源名称是IDB_PNG1
在图像文件中隐藏 Shellcode 载荷:使用 Python 和 C/C++ 实现

查找资源类型需要

  1. 转到您的项目并打开Solution Explorer窗口。
  2. 右键点击Resource.rc,选择Open with...并选择C++ Source Code Editor (with Encoding)
  3. 在图像文件中隐藏 Shellcode 载荷:使用 Python 和 C/C++ 实现
    在打开的Resource.rc标签中,按CTRL+F搜索您的图像文件资源名称。
  4. 您应该在资源名称后看到图像文件的资源类型,如下所示:
在图像文件中隐藏 Shellcode 载荷:使用 Python 和 C/C++ 实现

在将修改后的图像文件(包含载荷)存储到二进制文件的资源段中后,下一步是提取并执行它。以下用**C/C++**编写的代码演示了如何实现这一点。

这段代码的工作原理与之前从磁盘上提取载荷的示例类似。主要区别在于载荷提取,它直接从资源段而不是文件中检索载荷。

您可以在我的 GitHub 上查看代码:

  • payload-extractor-from-resource.cpp[5]

这段代码分为两个主要部分:

  1. 代码中的常量
  2. 载荷提取
  3. 执行载荷
    1. 这部分与从磁盘上的图像文件提取载荷相同。如果您想了解更多信息,请访问[从磁盘上的图像文件中使用 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. 查找资源:
    • 该函数使用FindResourceW()通过其ID(例如,IDB_PNG1)和类型(例如,PNG)定位资源。
  2. 加载并锁定资源:
    • LoadResource()将资源加载到内存中,LockResource()锁定它以确保安全访问其数据。
  3. 计算载荷大小:
    • 使用SizeofResource()确定总资源大小。
    • 然后通过将总资源大小减去原始文件大小来计算载荷大小。
  4. 提取载荷字节:
    • 使用memcpy,该函数从原始文件结束的偏移量开始提取载荷字节。

参考资料

[1]

https://github.com/WafflesExploits/hide-payload-in-images:https://github.com/WafflesExploits/hide-payload-in-images

[2]

payload-embedder.py:https://github.com/WafflesExploits/hide-payload-in-images/blob/main/code/payload-embedder.py

[3]

payload-extractor-from-file.cpp:https://github.com/WafflesExploits/hide-payload-in-images/blob/main/code/payload-extractor/payload-extractor-from-file/payload-extractor-from-file.cpp

[4]

aahmad097/AlternativeShellcodeExec:https://github.com/aahmad097/AlternativeShellcodeExec

[5]

payload-extractor-from-resource.cpp:https://github.com/WafflesExploits/hide-payload-in-images/blob/main/code/payload-extractor/payload-extractor-from-resource/payload-extractor-from-resource.cpp

原文始发于微信公众号(securitainment):在图像文件中隐藏 Shellcode 载荷:使用 Python 和 C/C++ 实现

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月28日12:13:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   在图像文件中隐藏 Shellcode 载荷:使用 Python 和 C/C++ 实现https://cn-sec.com/archives/3557121.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息