保护模式小节

一、8个段寄存器

ES CS SS DS FS GS LDTR TR  共8个

 

二、段寄存器的赋值

读写LDTR的指令:SLDT/LLDT

读写TR                :LTR(0环)/STR

读写SS      :LSS

一般的读写段用L '+' 段寄存器的名字就够了  (除了几个特殊的) 

或者Mov, DS,AX修改

//要修改CS段寄存器就必须修改EIP

三、段描述符与段选择子

 

 

四、加载段描述符至段寄存器

五、段描述符的一些位:

P位:

当P=1时,段描述符有效;当P=0时,段描述符无效。

G位:

当G=0时,Limit的范围是0x00000000-0x000FFFFF,其中,段描述符的20位在低位,高位补0,当G=1时,Limit的范围是0x00000FFF-0xFFFFFFFF,其中,段描述符的20位在高位,低位补F。

S位:

TYPE域:

代码段或数据段:

 

 

TYPE域高位为0时,表示数据段;

E=0,表示向上扩展,windows只使用向上扩展;E=1,表示向下扩展

 

 

使用向上扩展,段的范围就是红色部分;使用向下扩展,段的范围就是绿色部分。

 

高位为1时,表示代码段。

一致代码段与非一致代码段:

C=0,表示非一致代码段;C=1,表示一致代码段。

一致代码段又称共享代码段,可以被低权限的用户直接访问的代码

但一致代码段不允许高特权访问低特权的数据,Jmp跨段访问不能提权

比如,如果构造Jmp跨段访问 jmp xx(cs):0x00xxxxxx  

CS会改变,但本质上不算提权

系统段描述符:

D/B位:

对DS,ES等数据段:
D=1,段上限为4GB
D=0,段上限为64KB

对SS段:
D=1,使用32位堆栈指针寄存器;
D=0,使用16位堆栈指针寄存器.

对CS段:
D=1,采用32位寻址方式;
D=0,采用16位寻址方式。

 

 

 

六、访问特权:

RPL:段选择子的权限
DPL:段的权限
CPL:CPU权限

数据段权限检查遵循以下规则:
CPL <= DPL 并且 RPL <= DPL (数值上的比较)

mov DS,AX 

如果AX指向的段DPL = 0  但当前程序的CPL = 3 这行指令是不会成功的!

七、GDT表4四种情况可以跳转:代码段、调用门、TSS任务段、任务门

 

八、call不同跳转时存入堆栈的值:

短调用:

 

 

 长调用:

 

 

 

 如果长调用传参的话,参数应该在调用者cs与调用者esp之间

 

 九、门,调用门,中断门与陷阱门

十、中断门IDT表

IDT表可以包含3种门描述符:

 任务门描述符

中断门描述符 

陷阱门描述符      

构造调用门后retf返回,中断门iretd返回……

十一、Tss的成员使用

在使用门的时候,如果发生权限的切换,那么就有堆栈的切换,cs的cpl改变,ss也改变,切换时,会有新的ESP和SS(CS是由中断门或者调用门指定)这2个值从TSS(任务状态段来)

 

十二、TSS结构

 

不要把TSS与“任务切换”联系到一起

TSS的意义就在于可以同时换掉”一堆”寄存器

 

十三、三环加载Tr寄存器:

str ax

任务段描述符->tr寄存器->tss

 

十四、任务门

有很多保留位

 

十五:TSS结构体的位

P:当P=1时,段描述符有效;当P=0时,段描述符无效。

G位:G=0,Limit范围0x00000000-0x000FFFFF其中,段描符的20位在低位,高位补0.
当G=1,Limit范围0x00000FFF-0xFFFFFFFF其中,段描述符的20位在高位,低位补F

一般为1

 

D/B位:

DS,ES等数据段:
D=1,段上限为4GB
D=0,段上限为64KB

SS段:
D=1,使用32位堆栈指针寄存器;
D=0,使用16位堆栈指针寄存器.

 

CS段:
D=1,采用32位寻址方式;
D=0,采用16位寻址方

 

S位:s为1代表代码段/数据段

S为0代表系统段

 

 

Type位…就不多说了

十六:门的段描述符的构造

任务段:D/B位为0..                             xx00e9xx`xxxx0068             (68代表104个字节)

调用门:                                                        xxxxEC00`0008xxxx

中断门:                                                        xxxxee00`0008xxxx

任务们:                                                        0000e500`00480000(48而不是08)需要相应任务段,甚至能直接用、、、

 

十七、线程切换时堆栈的变化

每当线程切换的时候会把当前线程的ESP0写入TSS结构中(以后进行线程切换逆向的时候会找到具体的代码),所以我们所Ring3提权到Ring0得到ESP都是当前线程的Ring的栈顶。

 

十八、物理页的属性

P位       有效位          P=1有效

U/S        特权位          U/S=1代表3环可访问

R/W位   读写位          0为只可读,1为可写可读

A位       访问位          被访问过置一

D位       脏位              1表示被写过

PS位     大小页位       1代表大页

G位       与TLB有关  代表不被刷新

 

再2-9-9-12分页里(PAE),还有一个XD位。。

 

XD     执行位           1 不可能执行 0 可能执行


__EOF__

本文作者_TLSN
本文链接https://www.cnblogs.com/lordtianqiyi/articles/15802708.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   TLSN  阅读(43)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示