二.x86内核保护机制--段保护

一.段的作用:

  在x86-16体系中,为了解决16位寄存器对20位地址线的寻址问题,引入了分段式内存管理。而段的沿用,一方面是为了保持向下的拓展性,另一方面,也增加了可寻址的范围,增加了CPU的性能. 随着CPU性能的大幅度提升,生产商的研发重点,也开始着重于计算机的稳定性,和数据的安全性,因此,在会影响到计算机稳定性和重要数据的地方,就要给用户加上限制,限制用户的行为主要是,数据的读,写和执行,在限制用户的同时,又不能影响操作系统对数据和代码的使用,因此,引入了层(R0,R1,R2,R3)的概念,其中R1层和R2层,并未使用,R0就是我们一般常说的内核层,R3为应用层,也就是用户层,不同的层有不同的权限级别(R0>R1>R2>R3),为了限制人们随意进出R0层,胡乱删改重要内核数据,引起操作系统的崩溃,加入了段机制对人们进行了限制.

二.段寄存器:

代码段寄存器CS(Code Segment)

存放当前正在运行的程序代码所在段的段基址,表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移量则由IP提供。

数据段寄存器DS(Data Segment)

指出当前程序使用的数据所存放段的最低地址,即存放数据段的段基址。

堆栈段寄存器SS(Stack Segment)

指出当前堆栈的底部地址,即存放堆栈段的段基址。

附加段寄存器ES(Extra Segment)

指出当前程序使用附加数据段的段基址,该段是串操作指令中目的串所在的段。

FS寄存器在内核层和应用层的表现不太一样

GS寄存器 也是一个附加寄存器

 三.段寄存器的作用

  是用来存放段选择子(Selector),而段选择子在CPU实际应用当中,主要起到两个作用:  

  1.用于在GDT表中,查找到相对应的段描述符,确认属性.  

  2.表明RPL(请求特权级别)的值,CS作为代码段描述符,其段寄存器中的值,与其他段寄存器不同,称为:CPL.

例如:

DS:002B

先将002B拆分为2进制:

0000 0000 0010 1  0  11

RPL:3  即R3权限

TI: 0指示从全局描述符表GDT中读取描述符;TI:1指示从局部描述符表LDT中读取描述符(windows操作系统自身并没有使用LDT表,因此TI位,在windows里一直为0,除非你自己要用LDT表,否则TI位没什么用...)

索引号:5  下图中,所对应的是第6个描述符,(GDT表索引是从0开始的,每个描述符为8个字节,32位)

四.段描述符:

搜索 gdt 表:

  GDT表全程 Global Descriptor Table,段描述符表。

  其存储在 gdtr 寄存器中,我们在Windbg中使用 "r gdtr" 即可获取该地址。

  然后我们采用 dq address (一个段选择子四字,八字节) 来显示 gdt 表,如果知道索引想直接查看其地址,可以使用 dq address + (index * 8) 的公式来进行搜索。

在取得段描述符之后,我们对段描述符进行拆分,来获取他的具体属性:

  WORD Attribute;  高位8:15  和 20:23 的属性(下面详细讲解各标志位的作用)

  DWORD Base;    段基地址:: Base31:24   +  Base23:16  +  Base15:00 除了FS寄存器外,Base一般为:0x00000000

  DWORD Limit;     段地址最大范围:Seg Limit19:16  +  Seg Limit15:00  

  各标志位的作用:

  G位:   0-表示界限粒度为字节;G=1表示界限粒度为4K 字节。注意,界限粒度只对段界限有效,对段基地址无效,段基地址总是以字节为单位。

  D/B位:下面将会更详细的讲解

  L位:    用来设置是否为64位代码段.

  AVL位:是软件可利用位80386对该位的使用未做规定,Intel公司也保证今后开发生产的处理器只要与80386兼容,就不会对该位的使用做任何定义或规定。此为被linux和windows操作系统忽略。

 

  P位:0 - 无效段 、 1 - 有效段。(查看该段是否有效,最直接的就是查看该位)

  DPL位: 段特权级别(0到3,但是因为Windows并没有对R1和R2层进行使用,因此DPL的值,不是00就是11,也就是R0或者R3)

     S位:0 - 系统段、1 - 代码段或数据段。

  TYPE位:如果S位==1,则TYPE位进一步详解其代码段或数据段的有关属性(可读可写可执行等等)。

        如下图,一个直观判断到底是代码段还是数据段的方法:TYPE <= 7 数据段 ; TYPE >= 8 代码段。

        如果S位==0,那么此时为系统段,将会引出:调用门,中断门,陷阱门,任务门,TSS表和IDT表等概念.

  

 D/B位

  该位对于数据段和代码段有着不同的含义,但大体都是与位数大小有关。比如,如果我们使用32位操作系统,一次操作32位,又如何切换到对16位的操作,根本上就是使用这个位。

  1)代码段:在32位操作系统下,如果DB == 1,则默认操作数是32位,如果操作16位时,其会加上前缀指令66。

   (66 50 push ax / 50 push eax)

  2)数据段:该段作用与不同的数据段其含义不同。

  (1)SS段:DB == 0 ,使用16位寄存器  sp; DB == 1,使用32位寄存器 esp。

   (2) DS、ES、GS、FS:表示界限(Limit),DB == 0 ,Limit 64KB;DB == 1,Limit 0xFFFFFFFF。

 段权限检查:

  

  1)三个概念:

    (1)RPL(Request Privilege Level) 请求特权级别,段选择子的后两位。

    (2)DPL(Descriptor Privilege Level) 段描述特权级别,13位与14位。

    (3)CPL(Current Privilege Level)当前特权级别,当前工作在CS\SS段的RPL,我们称之为CPL

  2)权限检查:

    简单解释下上面的概念就很好理解,像 mov ,eax,3bh ; mov ds,eax 。 这种就会进行有关段权限检查,如果不通过赋值会失败。

    首先,CPL表示当前工作的环境(0环或3环),如果CPL为3环,其段选择子后两位不可能为0(不用访问,请求都请求不了)。

    而即使你生成请求,其还会和段描述符中的DPL校验,如果校验不通过,你依然无法生成。

原文地址:https://www.cnblogs.com/jszyx/p/12405111.html

时间: 2024-07-31 02:48:25

二.x86内核保护机制--段保护的相关文章

Android中的软件安全和逆向分析[二]—apk反破解技术与安全保护机制

在Android应用开发中,当我们开发完软件之后,我们不希望别人能够反编译破解我们的应用程序,不能修改我们的代码逻辑.实际上,在应用程序的安全机制考虑中,我们希望自己的应用程序安全性高,通过各种加密操作等来增大竞争对手的反编译破解成本.设想,竞争对手开发一个同样的应用程序需要10天,而破解我们的软件程序需要100天,那么势必会打消黑客程序员破解我们应用程序的念头.如何增加对手的破解成本,就需要考验我们应用程序的安全性有多高,加密技术有多强.一个优秀的应用程序,不仅能为用户带来利益,同时也能保护自

各种保护机制绕过手法

一.绕过GS编译选项 ●原理:通过VC++编译器在函数前后添加额外的处理代码,前部分用于由伪随机数生成的cookie并放入.data节段,当本地变量初始化,就会向栈中插入cookie,它位于局部变量和返回地址之间 ●绕过方法: 1.猜测/计算cookie Reducing the Effective Entropy of GS Cookies:http://www.uninformed.org/?v=7&a=2&t=html 至从覆盖SEH的方法出现后,这种方法目前已基本不用了,它没有后面

【安全健行】(6):Windows漏洞保护机制

2015/5/21 11:07:55 之前我们一直在Linux平台上分析漏洞,那是因为对于绝大多数Hacker获得一个Linux平台更加容易,而且主流的服务器系统基本也都是Linux/Unix的:另外一个好处就是Linux提供了用户自定义的强大功能,我们可以根据需要编译汇编程序代码,关闭相应的安全保护机制,便于我们的研究学习. 然而现实中有影响力的漏洞大多是基于Windows系统,因此这节我们来介绍下Winodws系统上是安全保护机制,至于Windows上的漏洞分析,我们会在之后的恶意代码分析章

linux程序的常用保护机制

linux程序的常用保护机制 来源 https://www.cnblogs.com/Spider-spiders/p/8798628.html 操作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险,包括DEP.ASLR等.在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了DEP(Linux下对应NX).ASLR(Linux下对应PIE)等机制,例如存在DEP(NX)的话就不能直接执行栈上的数据,存在ASLR的话各个系统调用的地址就是随机化的. 一.checksec che

GCC中的堆栈保护机制

以堆栈溢出为代表的缓冲区溢出已成为最为普遍的安全漏洞,由此引发的安全问题比比皆是.我们知道攻击者利用堆栈溢出漏洞时,通常会破坏当前的函数栈.在gcc中,通过编译选项可以添加 函数栈的保护机制,通过重新对局部变量进行布局来实现,达到监测函数栈是否非破坏的目的. gcc中有3个与堆栈保护相关的编译选项 -fstack-protector:启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码. -fstack-protector-all:启用堆栈保护,为所有函数插入保护代码. -fn

CPU保护机制

如果程序可以直接跟内核交互,那么操作系统会变的不稳定.因此有一个机制会讲内核和程序隔开. 一般的CPU有4层保护机制. 第0环,特权级别.只有内核才能运行到第0级别, 最外环,其他程序运行. 所以在内存上也是这样 CPU保护机制

操作系统学习(七) 、保护机制概述

保护机制是可靠运行多任务环境所必须的.它可以用于保护各个任务免受互相之间的干扰.在软件开发的任何阶段都可以使用段级和页级保护来协助寻找和检测设计问题和错误.当程序对错误内存空间执行了一次非期望的引用,保护机制可以阻止这种操作并且报告此类事件. 保护机制可以被用于分段和分页机制.处理器寄存器的2个比特位定义了当前执行程序的特权级,称为当前特权级CPL.在分段和分页地址转换过程中,处理器将对CPL进行验证. 通过设置控制寄存器CR0的PE标志(位0)可以让处理器工作在保护模式下,从而也就开启了分段保

Hystrix针对不可用服务的保护机制以及引入缓存

之前我写过一篇博文,通过案例了解Hystrix的各种基本使用方式,在这篇文章里,我们是通过Hystrix调用正常工作的服务,也就是说,Hytrix的保护机制并没有起作用,这里我们将在HystrixProtectDemo.java里演示调用不可用的服务时,hystrix启动保护机制的流程.这个类是基于NormalHystrixDemo.java改写的,只是在其中增加了getFallback方法,代码如下. 1 //省略必要的package和import代码 2 public class Hystr

Linux中的保护机制

Linux中的保护机制 在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了NX.PIE等机制,例如存在NX的话就不能直接执行栈上的数据,存在PIE 的话各个系统调用的地址就是随机化的. 一:canary(栈保护) 栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行.当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行.