内核通信、代码注入与模糊测试实践
1. 消息数据查看与启动消息实现
1.1 消息数据查看
我们可以通过将输出重定向到 hexdump 来查看消息的数据(别忘了在每个实验中运行 make 来构建内核)。从输出中可以明显看出, OOB_PRINT 不执行字符串格式化操作,因为内核不会做客户端能做的工作。
1.2 启动消息实现
通信协议要求内核发起通信,将其执行环境信息发送给客户端。我们通过实现“启动消息”来满足这一要求,该消息提供以下信息:
- 物理地址空间(从在虚拟机中运行的内核角度来看)。
- 内核地址(符号),其有两个目的:一是让客户端知道内核的加载位置,避免注入代码时意外覆盖;二是提供已知内核函数的地址,供外部代码使用。
启动消息的信息将编码在关联列表中,每对的第一个元素是第二个元素内容的标识字符串。第二个元素的布局取决于所提供的信息类型(通常编码为子列表)。这里我们使用“symbols”和“mmap”字符串来标记信息。
1.2.1 构建 “symbols”
构建“symbols”很直接,就是将符号名称及其地址组成关联列表。例如,提供内核的 ELF 头、BSS 段末尾以及 put_va 和 send_msg 函数的地址。
1.2.2 构建 “mmap”
为了构建“mmap”,我们需要修改引导代码以利用 GRUB 提供的多引导信息(MBI)区域。 kmain </
超级会员免费看
订阅专栏 解锁全文
2567

被折叠的 条评论
为什么被折叠?



