0

我读到了内存飞地,发现隐藏一些数据是一个有趣的功能,所以,我来了。

我无法在所需的 API 上找到任何内容,但 MSDN 文档有 [没有关于使用的源代码],我知道我必须调用以下命令:

  1. IsEnclaveTypeSupported: 以确保我可以继续。

  2. CreateEnclave:返回创建的飞地的基地址,虽然我也为此苦苦挣扎,但这个问题帮助了我。

  3. LoadEnclaveData:将数据添加到我们创建的飞地。

  4. InitializeEnclave: 激活飞地。

  5. 基于Windows Internal book(第1部分),execute我必须运行EENTER汇编指令,我也没有找到相关信息,但我认为CallEnclave使用飞地的基地址可以完成这项工作。

无论如何,我被困在第 3 步,我LoadEnclaveData正在返回错误代码87,即ERROR_INVALID_PARAMETER.

我只是将NOPs (0x90) 复制到该地址,只是为了通过正在运行的调试器查看它。

这是代码:

LPVOID  lpAddress ;
ENCLAVE_CREATE_INFO_VBS VBS = { 0 };
VBS.Flags = 0;
HANDLE hProcess = GetCurrentProcess();
lpAddress = CreateEnclave(
    hProcess,
    NULL,
    2097152, 
    NULL,
    ENCLAVE_TYPE_VBS,
    &VBS, 
    sizeof(ENCLAVE_CREATE_INFO_VBS),
    NULL
);
printf("[-] GetLastError : %d \n", GetLastError());
printf("[+] %-20s : 0x%-016p\n", "lpAddress addr", (void*) lpAddress);
unsigned char buffer[] = {0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 , 0x90 , 0x90 };
LoadEnclaveData(
    hProcess,
    lpAddress,
    &buffer,
    sizeof(buffer),
    PAGE_READWRITE,
    NULL,
    0,
    0,
    0
);
printf("[-] GetLastError : %d \n", GetLastError());

根据 MSDN 的LoadEnclaveData文档,他们没有指定要做什么lpPageInformation,所以我认为是问题所在,但他们说The lpPageInformation parameter is not used.所以我重新检查了几个参数,我发现它nSize必须是一个整数multiple of the page size.所以我很困惑,现在要做什么?

如果有人确定要在飞地中执行缓冲区,请告诉我。

顺便说一句,选择标题的事情让我很生气,[我在这上面浪费了比写这篇文章更多的时间]。

4

0 回答 0