0x0 实验对象

  • bios1.bin:未修改的原始OVMF镜像
  • bios2.bin:修改UIAPP后,重新编译的OVMF镜像
  • syshd.iso:使用qemu-img创建的虚拟硬盘
    • 容量大小8G
    • 三个分区 EFI(FAT)+ SWAP + EXT4,GPT分区表
    • EXT4分区安装Alpine Linux,用户名root,密码123

0x1 实验思路

在UIAPP中插入相应代码,尝试在FAT分区中实现文件写入

代码功能实现:在磁盘的EFI分区下的/EFI/文件夹中创建一个TestWT.txt文件,并向其中写入指定字符串。

0x2 实验过程

0x20 bios1.bin | 正常启动

1
qemu-system-x86_64 -hda syshd.img -bios bios1.bin -m 4096

使用原始bios1.bin作为bios,正常启动进入系统

观察原始/boot下挂载的EFI分区内情况:/EFI文件夹存在两个目录

20230416144524

0x21 bios2.bin | 正常启动

1
qemu-system-x86_64 -hda syshd.img -bios bios2.bin -m 4096

使用修改后的镜像bios2.bin作为bios,直接进入系统

观察/boot下挂载EFI分区内情况,没有TestWT.txt文件,说明正常启动过程中不会运行UEFI应用程序UIAPP

20230416151527

0x22 bios2.bin | 从界面启动

1
2
qemu-system-x86_64 -hda syshd.img -bios bios2.bin -m 4096
按Esc进入bios

从BIOS UI进入系统,会运行UIAPP

20230416152436

选择从硬盘启动,经过grub后进入系统,观察/boot下挂载EFI分区内情况,发现插入的代码已经成功执行。

20230416152726

0x23 bios2.bin | UEFI Shell

删除/boot/EFI/testWT.txt后,从BIOS UI进入BIOS Shell,也能执行插入代码

20230416151820

0x3 实验记录与结论

  1. 在UEFI APP中插入代码,能够实现在UEFI中对FAT分区的读写,并且只有当 UEFI APP被执行时才会运行插入的代码
  2. 尝试在UEFI驱动中(LogoDxe)插入同样的代码,可以通过编译生成镜像,但镜像无法正常启动,可能是驱动执行时无法调用文件操作对应API
  3. UEFI APP 和UEFI DXE驱动在固件镜像中位于同一位置,并且能够被替换

0x4 附 插入代码

edk2/MdeModulePkg/Application/UiApp/FrontPage.c

函数入口:InitializeFrontPage

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
////////////////////////////////插入开始////////////////////////////////
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Volume;
EFI_FILE_PROTOCOL *RootDir;
EFI_FILE_PROTOCOL *FileHandle;
UINTN BufferSize;
CHAR8 *Buffer = "helloimzzh";
CHAR16 FileName[] = L"\\EFI\\testWT.txt";

gBS->LocateProtocol(&gEfiSimpleFileSystemProtocolGuid, NULL, (VOID **)&Volume);
Volume->OpenVolume(Volume, &RootDir);
RootDir->Open(RootDir, &FileHandle, FileName, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, 0);
BufferSize = AsciiStrLen(Buffer);
FileHandle->Write(FileHandle, &BufferSize, Buffer);
FileHandle->Close(FileHandle);
////////////////////////////////插入结束////////////////////////////////