0xd00 随笔小记

Back

利用 PE 文件段 (.data, .text, .rsrc) 注入并隐藏 ShellcodeBlur image

shellcode可以根据需要保存在PE结构的多个不同段中。不同的段拥有不同的属性(如读、写、执行权限),了解并利用这些特性可以方便我们将 Payload 放置到最合适的位置来达到一定的伪装效果。

首先我们生成一段弹出计算器的shellcode:

msf生成shellcode

.data段#

编译后通过我编写的PE分析工具查看:

pe analyzer online hex view .data

可以发现使用全局变量unsigned char保存shellcode,在编译后shellcode被保存到了.data段。

这是因为PE文件的.data段是PE文件的可执行部分中包含已初始化全局变量和局部变量的位置。此段可读写,适合在运行时动态解密加密的有效负载。

pe analyzer online .data section

.rdata段#

简单修改上面的代码,添加一个const修饰符。

const unsigned char buf[] ="...";
c

const修饰符修饰的变量被认为是只读数据,任何尝试对其修改的行为都会导致访问冲突error: assignment of read-only variable 'buf'

pe analyzer online .rdata section

最终在编译后就会被保存到rdata段,rdata中的r就是指read-only

pe analyzer online hex view .rdata

.text段#

需要使用下面的方式告诉MSVC编译器将此变量放置在.text段中。.text段默认具有可执行权限。因此在此段中的变量无需编辑内存区域权限,直接就可以运行。这对于小于 10 个字节的小型负载很有用,例如[上篇文章中的0xC3](Windows内存管理基础:VirtualAlloc、DEP 与 ASLR • 0xd00’s blog)。

#pragma section(".text")
__declspec(allocate(".text")) const unsigned char buf[] ="...";
c

pe analyzer online .text section

pe analyzer online hex view .text

.rsrc段#

.rsrc段读取shellcode的方式可能会更加繁琐一些。

  1. msfvenom -p windows/x64/exec CMD=calc.exe -f raw -o icon.ico

  2. Resource Files -> 添加 ->新建项

  3. 资源 -> 资源文件(.rc)

  4. 资源视图->Resource.rc右键->添加资源

  5. Accelerator->导入->选择生成的.ico文件->资源类型RCDATA

  6. 编译后,有效负载将存储在 .rsrc 节中,但无法直接访问。

  7. 想要访问.rsrc段中的数据需要通过几个WINAPI

可以看到Shellcode被成功从资源段中提取并运行。 运行效果

x64dbg中也能看到.rsrc中的payload已被复制到了新分配的可执行区域中。 通过x64dbg查看拷贝.text中的shellcode和.rsrc段中的原始shellcode

pe analyzer online hex view .rsrc

总结#

通过本次探索,我们掌握了四种在 PE 文件中存储 Shellcode 的核心技术。下表对它们进行了简要的对比:

方法目标段C++ 实现方式段权限隐蔽性优点与缺点
方法一.data全局变量RW优点: 简单直接。
缺点: 特征明显,易被检测。
方法二.rdataconst 全局变量R优点: 伪装成只读数据,更隐蔽。
缺点: 仍需内存拷贝。
方法三.text__declspec(allocate)RX优点: 与代码混合,无需 VirtualAlloc
缺点: 依赖编译器。
方法四.rsrc作为资源嵌入,API加载R极高优点: 行为类似合法程序,极难发现。
缺点: 实现稍显复杂。
利用 PE 文件段 (.data, .text, .rsrc) 注入并隐藏 Shellcode
https://blog.0xd00.com/blog/windows-pe-payload-storage-locations
Author 0xd00
Published at 2025年7月16日
Comment seems to stuck. Try to refresh?✨