小编Pir*_*ate的帖子

无法从内核模式更改CS寄存器值。无效的操作码:0000

从具有此代码段的模块代码中,我尝试更改CS寄存器的值:

asm("pushq %rax");
asm("mov $0x10,%rax");
asm("mov %rax,%cs");
asm("popq %rax");
Run Code Online (Sandbox Code Playgroud)

实际上,CS寄存器包含段选择器- $0x10,也是内核宏返回的该值__KERNEL_CS。我想做的是用完全相同的值重写CS寄存器。不幸的是,我遇到了错误,没有摘要,则没有错误。

Aug  1 20:26:37 myhost kernel: [ 2905.693297] invalid opcode: 0000 [#1] SMP 
Aug  1 20:26:37 myhost kernel: [ 2905.694223] CPU: 0 PID: 7140 Comm: insmod Tainted: P           OE   4.4.0-148-generic #174~14.04.1-Ubuntu
Aug  1 20:26:37 myhost kernel: [ 2905.694362] task: ffff88007a0edb00 ti: ffff880068c54000 task.ti: ffff880068c54000
Aug  1 20:26:37 myhost kernel: [ 2905.694420] RIP: 0010:[<ffffffffc114e114>]  [<ffffffffc114e114>] hello_init+0x44/0xe0 [hello_module]
Aug  1 20:26:37 myhost kernel: [ 2905.694497] RSP: 0018:ffff880068c57ca0  EFLAGS: 00010282 …
Run Code Online (Sandbox Code Playgroud)

gcc x86-64 inline-assembly linux-kernel att

4
推荐指数
2
解决办法
126
查看次数

读取GDTR的值

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

unsigned long j;
asm("sgdt %0" : "=r"(j));
Run Code Online (Sandbox Code Playgroud)

x86 assembly gcc inline-assembly

1
推荐指数
1
解决办法
91
查看次数

标签 统计

gcc ×2

inline-assembly ×2

assembly ×1

att ×1

linux-kernel ×1

x86 ×1

x86-64 ×1