保护模式小节
一、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__

本文链接:https://www.cnblogs.com/lordtianqiyi/articles/15802708.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现