【问题标题】:How to take the hash of ELF binary in linux kernel?如何在 Linux 内核中获取 ELF 二进制文件的哈希值?
【发布时间】:2022-02-11 22:53:28
【问题描述】:

我正在从内核内部实现二进制证明。我正在使用kernel_read_from_file() 函数读取文件。函数定义如下:

int kernel_read_file_from_path(const char *path, void **buf, loff_t *size,
               loff_t max_size, enum kernel_read_file_id id)

该函数将文件内容存储在buf 中。当我读取带有.c.h 扩展名的文件时,代码运行良好。但对于 ELF 二进制文件:

Value stored in buf = ELF

我在这里缺少什么?如何从内核中读取 ELF 二进制文件?

以下是相关代码:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/file.h>
// #include "sha256.h"
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Robert W. Oliver II");
MODULE_DESCRIPTION("A simple example Linux module.");
MODULE_VERSION("0.01");
 
 
static int __init lkm_example_init(void)
{
  void *data;
  loff_t size;
  int ret;
  char path1[50] = "/etc/bash.bashrc";
    char path2[50] = "/bin/sh";
 
  ret = kernel_read_file_from_path(path1, &data, &size, 0, READING_POLICY);
  printk(KERN_INFO "Hello, World!\n");
  printk(KERN_INFO "%lld\n", size);
  printk(KERN_INFO "%s", (char*)data);
 
  ret = kernel_read_file_from_path(path2, &data, &size, 0, READING_POLICY);
  printk(KERN_INFO "%lld\n", size);
  printk(KERN_INFO "%s", (char*)data);
  // vfree(data);
  return 0;
}
static void __exit lkm_example_exit(void)
{
  printk(KERN_INFO "Goodbye, World!\n");
}
module_init(lkm_example_init);
module_exit(lkm_example_exit);

这是 Makefile:

# Save file as read_elf.c
obj-m += read_elf.o
# This line tells makefile that the given object files are part of module
 
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

【问题讨论】:

  • minimal reproducible example 可能会有所帮助。
  • "如何从内核中读取 ELF 二进制文件?" - 好吧,您已经使用kernel_read_file_from_path 读取 ELF 文件。该文件中的第一个字节是“E”、“L”和“F”(参见例如en.wikipedia.org/wiki/Executable_and_Linkable_Format),这就是您得到该输出的原因。您可能想要解析 ELF 文件并从中提取一些信息(例如字段)。 Linux 内核包含一些解析 ELF 文件的代码。参见例如函数load_elf_binary.

标签: linux-kernel elf attestations


【解决方案1】:

我在这里缺少什么?如何从内核中读取 ELF 二进制文件?

您错过了 ELF 文件不是文本文件,而是二进制文件这一事实。但是,您尝试将其打印为字符串(printk 中的 %s 说明符),它只会打印前几个字符并在第一个零字节(\0)处停止,认为它是字符串终止符。

事实证明,正如@Tsyvarev 在上面的 cmets 中指出的那样,ELF 文件总是以字节 7f 45 4c 46 开头,在 ASCII 中是 ELF(第一个字节 7f 是不可打印的)。这就是您阅读后在缓冲区中看到的内容。

如果您在阅读后查看size,您确实会看到它大于4,这意味着文件被正确读取。尽管您可能仍想检查错误并确保您阅读了整个文件。

【讨论】:

    猜你喜欢
    • 2015-06-07
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2021-07-08
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多