|
老师在第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的选择子?
|
|