gpt4 book ai didi

assembly - 读取 GDTR 的值

转载 作者:行者123 更新时间:2023-12-05 00:47:24 25 4
gpt4 key购买 nike

我发现可能是通过 SGDT 汇编命令读取 GDTR。在我的 C 代码中插入这段程序集,我得到 Error: operand type mismatch for 'sgdt'

unsigned long j;
asm("sgdt %0" : "=r"(j));

最佳答案

sgdt 只能取内存操作数,不能取寄存器,所以必须是 "=m"。操作数大小是 2+8 字节(对于 ;按顺序限制然后是地址)所以你需要一个结构;使用 long 将导致存储在对象之外。

阅读手册! https://www.felixcloutier.com/x86/sgdt


其他注意事项:

  • UMIP (用户模式指令预防)让内核停止用户空间(特权级别 3)运行该指令,因为它只帮助用户空间击败内核 ASLR 或其他漏洞;用户空间对此地址没有合法用途。在像 Linux 这样的普通内核下,用户空间不能取消引用它从中获得的虚拟地址。所以Linux does enable UMIP如果硬件支持(Zen 2、Cannon Lake、Goldmont Plus)。

  • Linux 内核为此有一个宏:store_gdt(dtr),它使用
    asm volatile("sgdt %0":"=m"(*dtr)); with struct desc_ptr *dtr


在我的带有 Skylake CPU(不支持 UMIP)的 Linux 5.18 系统上,我将 sgdt [rsp](NASM 语法)放入一个静态可执行文件中,这样我就可以使用 GDB 单步执行它(starti/stepi)。在那条指令之后:

  • x/1hx $rsp 显示限制为 0x007f(存储在 2 个字节中,GDB 称之为半字,Intel 称之为字)。<
  • x/1gx $rsp+2 显示 qword 地址恰好是 0xfffffe00000ed000,这是一个有效的内核地址(48 位符号扩展,但相当远从地址空间规范范围的上半部分的最顶部开始。)根据 docs/x86/x86-64/mm.txt ,从 fffffe0000000000 开始的 0.5TB 包含 cpu_entry_area 映射,因此可以在此处找到 GDT 以及其他地址暴露给用户空间的内核内容(在没有 UMIP 的 CPU 上),并且必须一直映射,即使在有 Meltdown 的 CPU 上也是如此。

关于assembly - 读取 GDTR 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57196984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com