(1) [保护模式]段寄存器属性

0.段寄存器属


注意:我使用vs2019调试出现了许多奇奇怪怪的错误,如果你出现了与我同样的情况,请打开xp虚拟机中的vc6进行调试(如果是C++工程请不要包含任何C++头文件)


首先,段寄存器是96位的
段寄存器属性


在这里插入图片描述

GS寄存器 当中断执行完成之后会被置零,windows并没有使用这个寄存器

1.论证Attribute位的存在

执行下面的代码,因为ss寄存器中的attribute属性是可读可写的,所以可以顺利执行

int var = 0;
int main() {
    _asm {
        mov ax, ss
        mov ds, ax //将ds寄存器的值修改为ss寄存器的值
        mov dword ptr ds:[var], eax
    }
    return 0;
}

执行结果
在这里插入图片描述


修改部分代码,重新执行,会出错

int var = 0;
int main() {
    _asm {
        mov ax, cs //将ss修改为cs
        mov ds, ax 
        mov dword ptr ds:[var], eax
    }
    return 0;
}

在这里插入图片描述

至此证明了段寄存器的attribute限制了我们写入这个地址


2.证明base的存在

众所周知,向 0 (NULL)地址写入是会报错的(NULL 是 C 中定义的宏)
所以设计如下代码

int main() {
    __asm {
        mov ax, fs
        mov es, ax
        mov eax, dword ptr es:[0]
    }
    return 0;
}

在这里插入图片描述

这个代码是能正常运行的,查上表得知,原来我们访问的地址是 gs.base + 0 = 0x7FFDE000
这个代码不能执行到结束,因为es的值被改掉了,下一次用到es寄存器的时候是会出错的


3.验证Limit存在

下面这段代码会会在mov eax, dword ptr gs:[1000]执行出错

int main() {
    __asm {
        mov ax, fs
        mov gs, ax
        mov eax, dword ptr gs:[0x1000] //如果将这个数改成0x0 - 0x999就不会出错
    }
}

在这里插入图片描述


都看到这里了,不如把代码复制下来,自己调试试试,加深印象,千万别做个代码观察师哦

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值