Intel SGX入門教程(二)在windows環境搭建intel sgx環境並運行helloworld程序

一 、環境要求

1.1 實驗環境不低於一下要求

  • 64 位 Microsoft Windows 操作系統
  • Microsoft Visual Studio 2015
  • 英特爾軟件防護擴展 SDK

1.2 BIOS中開啓SGX配置

不同bios的設置可能會有區別,即使bios不支持sgx,也不會影響入門學習。我們可以通過SGX
SDK裏面內置的模擬器來運行調試enclave程序。

手動 BIOS 配置

  1. 系統在啓動過程中,鍵入要進入 BIOS 擊鍵 (通常功能鍵)。

  2. 通過下面的菜單導航:

      英特爾高級菜單-> CPU 配置軟件 Guard 擴展指令集 (SGX)->
    
  3. BIOS 都會顯示下面的選項。(並非所有系統 Oem 都支持所有的三個選項。)

      已啓用
      軟件控制
      已禁用
    

這些選項定義,如下所示:

     已啓用

如果設置此選項,英特爾軟件防護擴展是已啓用且可供使用的應用程序。

     注:如果設置已啓用,英特爾高級菜單-> CPU Configuration-> PRMRR必須還配置。(一些 Oem 可能會自動分配 PRMRR 值時啓用了英特爾 SGX。)如果 OEM 支持 PRMRR 所選內容,將值設爲 32 MB,64 MB 或 128 MB。英特爾參考 BIOS 的默認選項爲 128 MB。

軟件控制
如果設置軟件控制,您的應用程序必須支持在英特爾軟件防護擴展功能檢測過程(以前提供的鏈接) 中提及英特爾 SGX 使用 API.

     注:支持通過軟件參加英特爾軟件防護擴展,則可能需要重新啓動系統。

     已禁用

如果設置被禁用,英特爾 SGX 已明確禁用,並通過軟件應用程序無法啓用它。您應更改此設置爲啓用。如果已禁用,則可以只構建/運行英特爾 SGX 啓用模擬模式中的應用程序。此外,英特爾 SGX 平臺軟件 (PSW) 將無法安裝。

4.後啓用英特爾 SGX,輸入鍵擊保存並退出BIOS。

二 、軟件安裝

2.1 Intel ME下載及安裝

https://downloadcenter.intel.com/download/28680/Intel-Management-Engine-Driver-for-Windows-7-
E:\devsoft\sgx\ME_SW_1909.12.0.1237\Corp\ME_SW_MSI\SetupME.exe

SGX有些相關的安全功能需要Intel Management Engine(ME)提供(單向計數器monotonic counter和實時時鐘RTC)以及互聯網連接,所以建議安裝SGX SDK及PSW時保持互聯網連接, 並且安裝完全版的Intel ME軟件包

2.2 安裝Visual studio 2017

通過微軟官方下載Visual Studio IDE,不是code。
https://visualstudio.microsoft.com/

這一步一定要在安裝SGX SDK之前。否則,你啓動VS2017時,無法看到SGX的插件。

2.3 安裝SGX SDK

2.3.1 下載

https://registrationcenter.intel.com/en/products/postregistration/?sn=CCXS-ZSSJ7GG5&EmailID=908947250%40qq.com&Sequence=2444010&ret=n
下載PSW(平臺環境)和SDK(必須的),下載後的exe文件解壓後,有說明文檔和安裝的exe
在這裏插入圖片描述

在這裏插入圖片描述

2.3.2 新建項目可以看到 Intel SGX Enclave Project時,說明你的環境是ok的。

在這裏插入圖片描述

Hello World

原生C++的helloworld (高手可以跳過)

// main_app.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//
#include"pch.h"
#include <stdio.h>
#include <string.h>

#define MAX_BUF_LEN 100


void foo(char *buf, size_t len)
{
	const char *secret = "Hello App!";
	if (len > strlen(secret))
	{	
		memcpy(buf, secret, strlen(secret) + 1);
	}
}

int main()
{
	char buffer[MAX_BUF_LEN] = "Hello World!";
	foo(buffer, MAX_BUF_LEN);
	printf("buffer:\"%s\"\n", buffer);
	return 0;

}

ctrl+f5 運行。
定義了一個buffer和長度。將Hello World傳入後打印。
在這裏插入圖片描述

Windows版Hello World的所有代碼都是運行在Windows內存空間的。因此運行在這個Windows運行環境下的其他程序可以很容易的通過一些漏洞攻擊Hello World的內存空間,例如通過修改foo()函數代碼段的數據,把buffer[]數組內的“Hello App”替換成其他的字符串。

Enclave版本Hello World

修改edl文件,在ECALLs添加 foo函數調用
enclave {
    from "sgx_tstdc.edl" import *;

    trusted {
        /* define ECALLs here. */
		public void foo([out,size=len] char* buf,size_t len);

    };

    untrusted {
        /* define OCALLs here. */

    };
};

打開原生版本的helloworld項目,文件-》添加-》現有項目

目的:把enclave項目add到原生項目
在這裏插入圖片描述
把enclave項目添加到原生C++的項目中去。資源裏表裏可以看到存在兩個項目
在這裏插入圖片描述

在原生(main_app)右鍵 import Enclave

在這裏插入圖片描述
選中之前修改的edl文件,OK
在這裏插入圖片描述

文件結構

停頓一下,先看看現在的文件目錄。(實驗命名不是很規範,看起來有點累)
main_app.cpp是原生的helloworld。
Enclave1.cpp是Enclave項目創建的文件。
在這裏插入圖片描述

編輯 Enclave1.cpp
#include "Enclave1_t.h"

#include "sgx_trts.h"
#include <string.h>

void foo(char *buf, size_t len)
{
	const char *secret = "Hello App!";
	if (len > strlen(secret))
	{
		memcpy(buf, secret, strlen(secret) + 1);
	}
}
編輯main_app.cpp
#include "pch.h"
#include <stdio.h>
#include <tchar.h>
#include "sgx_urts.h"
#include <string.h>
#include "Enclave1_u.h"

#define ENCLAVE_FILE _T("Enclave1.signed.dll")
#define MAX_BUF_LEN 100


int main()
{	
	sgx_enclave_id_t	eid;
	sgx_status_t		ret = SGX_SUCCESS;
	sgx_launch_token_t	token = { 0 };

	int updated = 0;
	char buffer[MAX_BUF_LEN] = "Hello World!";

	//創建包含token的enclave容器
	ret = sgx_create_enclave(ENCLAVE_FILE, SGX_DEBUG_FLAG, &token, &updated, &eid, NULL);
	if (ret != SGX_SUCCESS)
	{
		printf("APP:error %#x ,failed to create enclave .\n", ret);
		return -1;
	}

	//Enclave CALL(ECALL) 啓動enclave容器
	foo(eid,buffer,MAX_BUF_LEN);
	printf("%s\n",buffer);
	getchar();

	//銷燬enclave容器
	if (SGX_SUCCESS != sgx_destroy_enclave(eid))
		return -1;
	system("pause");
	getchar();
	return 0;

}



在這裏插入圖片描述

編譯結果
1>------ 已啓動全部重新生成: 項目: main_app, 配置: Debug Win32 ------
2>------ 已啓動全部重新生成: 項目: Enclave1, 配置: Debug Win32 ------
2>Creating proxy/bridge routines
1>Creating untrusted proxy/bridge routines
1>pch.cpp
2>Enclave1.cpp
1>Enclave1_u.c
2>Enclave1_t.c
2>  正在創建庫 E:\sgx\main_app\Debug\Enclave1.lib 和對象 E:\sgx\main_app\Debug\Enclave1.exp
2>Enclave1.vcxproj -> E:\sgx\main_app\Debug\Enclave1.dll
2>sign the enclave
2>The required memory is 0x15f000.
2>Succeed.
2><EnclaveConfiguration>
2>    <ProdID>0</ProdID>
2>    <ISVSVN>0</ISVSVN>
2>    <StackMaxSize>0x40000</StackMaxSize>
2>    <HeapMaxSize>0x100000</HeapMaxSize>
2>    <TCSNum>1</TCSNum>
2>    <TCSPolicy>1</TCSPolicy>
2>    <DisableDebug>0</DisableDebug>
2>    <MiscSelect>0</MiscSelect>
2>    <MiscMask>0xFFFFFFFF</MiscMask>
2></EnclaveConfiguration>
1>main_app.cpp
1>main_app.vcxproj -> E:\sgx\main_app\Debug\main_app.exe
========== 全部重新生成: 成功 2 個,失敗 0 個,跳過 0 個 ==========
運行結果

在這裏插入圖片描述

結語

運行的過程並不順利,我本身不懂C++,也沒用過VS2017。報了很多lib找不到或者無法打開的錯誤。經過大量嘗試一後才跑通了helloworld。遇到問題慢慢分析,可以參考其他文章。關於如何打卡intel sgx的支持,還有檢查手段。

需要源碼的可以先留言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章