找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 633|回复: 3

x86汇编语言第16章里CPL的问题

[复制链接]

3

主题

33

回帖

381

积分

至尊会员

积分
381

至尊会员

发表于 2024-3-8 10:21:31 | 显示全部楼层 |阅读模式
老师在第16章里提到低权限(比如用户CPL=3)代码可以在调用(通过call gate)高权限(比如内核例程CPL=0)代码时,通过给定一个系统内核的段选择子(RPL=0)去访问甚至改写系统内核的数据段(DPL=0)。

我试着修改了下代码清单内核代码和用户程序代码,实现了这个效果,请老师指教下,我这个实现和理解对不对。

用户程序修改部分:

         mov bx,0x30                              ; 在返回到内核代码前,把内核core_data段的选择子 0x30送入bx
         call far [fs:TerminateProgram]       ;将控制权返回到系统  


内核程序修改部分:

return_point:

         mov ds,bx                                  ;返回到内核代码后,将用户程序送入bx的内核core_data段选择子0x30送入ds
                                                          ;修改ds段寄存器时的特权检查应该是CPL=RPL=DPL=0, 所以能通过?
         mov ebx,salt_4                           ;ebx指向core_data段中的         salt_4           db  '@TerminateProgram'
         call sys_routine_seg_sel:put_string  ;用户程序利用bx传入一个RPL=0的选择子,然后通过返回到内核代码后,基于CPL=0,访问了DPL=0的数据段,打印出 @TerminateProgram


问题,权限切换时,通用寄存器没有被修改,所以用户程序(CPL=3)可以利用通用寄存器传入一个RPL=0的选择子?

350

主题

281

回帖

2834

积分

管理员

积分
2834
发表于 2024-3-8 12:07:36 | 显示全部楼层
首先,特权级转移和通用寄存器无关,不管你传入什么。
其次,return_point是在内核态执行的,此时的特权级为0。不管bx的RPL是什么,总是可以代入DS,因为,如果CPL为0,可以访问任何特权级的数据段。
最后,在return_point里打印字符串时,是在CPL=0的状态下。没有权限切换。

3

主题

33

回帖

381

积分

至尊会员

积分
381

至尊会员

 楼主| 发表于 2024-3-8 12:53:03 | 显示全部楼层
站长 发表于 2024-3-8 12:07
首先,特权级转移和通用寄存器无关,不管你传入什么。
其次,return_point是在内核态执行的,此时的特权级 ...

那请问老师该如何理解图16-7中的例子?
我的这个修改是不是就是图16-7的一种实现方式?

因为这个情况,所以习题里用arpl的指令把传入的选择子里的RPL匹配的到调用者(用户程序,通过堆栈读取用户程序cs段的cpl),防止用户程序恶意传入rpl=0的选择子来访问dpl=0的数据段?


350

主题

281

回帖

2834

积分

管理员

积分
2834
发表于 2024-3-8 13:27:14 | 显示全部楼层
cindeequan 发表于 2024-3-8 12:53
那请问老师该如何理解图16-7中的例子?
我的这个修改是不是就是图16-7的一种实现方式?

是的,这确实是16-7所讲的情况。因为是从CPL=3带一个DPL=0的数据段选择子进内核,而且在内核里也确实用这个选择子成功代入了DS。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2024-9-17 03:42 , Processed in 0.247694 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表