zoukankan      html  css  js  c++  java
  • D/B位、一致与非一致代码段、向下拓展的实验与总结

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

    D/B位与向下拓展的实验与总结

    一、D/B位的介绍

      D/B位当对于代码段时其是D位,当对于数据段时其是B位。

      对于代码段,会影响其寻址模式,影响硬编码中指令前缀;对于数据段,其表示段长,当B位为0时,表示该段为16位段,此时其G为自然是无效的。

    二、在代码段属性中有一个向上拓展与向下拓展(此与代码段的B位紧密相关的)。

      向上拓展 [base,base+limit] 有效,其余无效;向下拓展[base,base+limit]无效,其余有效。

       

    三、向上拓展与向下拓展的实验

    为了证明该理论,我们来进行一个实验。

    1.源代码:

     1 #include "stdafx.h"
     2 
     3 char g_buf[] = {125, 124, 123, 121};
     4 int main(int argc, char* argv[])
     5 {
     6         printf("全局变量的地址为: 0x%p, 请在48处填写数据段描述符
    ", &g_buf);
     7         getchar();
     8         char l_var = 0;
     9         char u_aa = 0;
    10         __asm
    11         {
    12                 mov ax, 0x48
    13                 mov ds, ax
    14                 mov al, byte ptr ds:[0]
    15                 mov cl,byte ptr ds:[1]
    16                 mov u_aa,cl
    17                 mov l_var, al
    18                 mov ax, 0x23
    19                 mov ds, ax
    20         }
    21         printf("局部变量的值为:%d  %d
    ", l_var,u_aa);
    22         getchar();
    23         return 0;
    24 }

    2. 实验思路

    我们根据该地址构造段描述符,默认向上拓展,如果此时改为向下拓展,则访问数组肯定会出错(被置为不可访问)。

    3. 代码段描述符模板

    我们根据ds位去找对应的代码段模板 00cff300`0000ffff

    4. 运行程序,查看数组地址来构造段描述符

     00cff300`0000ffff -> 00cff342`5A30ffff(向上拓展)-> 00cff742`5A30ffff(向下拓展)

    5. 利用windbg将构造的向下拓展的段描述符填写进入0x48偏移处,继续运行程序,显示访问异常,而改为向上拓展的段描述符则不会出现访问异常

     

     四、一致代码段与非一致代码段

      一致代码段,可以让三环的权限访问零环的代码,现在操作系统都采用非一致代码段。

      难道这就意味着如果将段描述符改为一致代码段,那么三环可以访问零环吗?当然不可以,因为现在操作系统采用段页机制,即使过了段保护,也会存在页保护让你禁止访问。

  • 相关阅读:
    MySQL慢日志
    百万级数据生成。
    layui的数据表格加上操作
    WINDOWS命令行关闭本地占用的端口
    项目中路径问题
    linux服务器上使用find查杀webshell木马方法
    mysql锁分析相关的几个系统视图
    Centos7中网络及设备相关配置
    centos7版本中ssh相关的设置
    mysql权限参考
  • 原文地址:https://www.cnblogs.com/onetrainee/p/12364694.html
Copyright © 2011-2022 走看看