Kernel Mode, User Mode

之前关于kernel mode,user mode之间的切换,有个问题一直有些疑惑。

一个进程有没有办法,从user mode切换到kernel mode去执行自己的代码。我知道答案肯定是不行,但是为啥不行,一直不太清楚。

今天看了点东西,算是有了解答。

首先,cpu有ring0,ring1,ring2,ring3这4个级别,windows只用了ring0,ring3,其实kernel mode = ring0, user mode=ring3.

Ring3下有些指令是不能执行的,如:lgdt,lldt,ltr...

系统有维护一张GDT的table(call gate,调用门),user mode想切换到kernel mode需要调用call,jmp指向一个远指针, 指向的code必须在GDT的table里才可以。

而Table的内容存放在一块memory里,只有Ring0才能访问,除非有漏洞,否则,user mode的代码是没办法进入Ring0去为所欲为的。

有一个漏洞,让Ring3有机会去修改GDT,Ring3可以执行sgdt拿到GDT的虚拟地址,根据Mapping关系,算出物理地址,open Device\PhysicalMemory,去修改这块物理地址。

修改GDT,添加自己的call gate。

转载于:https://www.cnblogs.com/zzSoftware/p/3311072.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值