段描述符属性和S位实验

段选择子结构

段描述符结构

S位实验

S位:
表示段的模式
S=1的时候是用户段描述符(比如代码段 数据段)
S=0表示系统段描述符(主要是门一类的东西)

我们使用Vmware+Windbg的方法来进行双机调试

在win7 32中安装visual studio 2015版本来进行编写代码

我们首先编写一个正常的汇编代码,下断点以后看到,我们是可以对数据段val进行访问的,访问权限都是正常的

 

CS = 001B DS = 0023 ES = 0023 SS = 0023 FS = 003B GS = 0000

DS段是0x23,换算成二进制也就是0010 0011

根据段选择子结构图我们得知 11 也就是RPL 这里10进制是3 也就是说该程序的RPL权限是三环权限

然后TI代表着指向的描述符表,这里是0,也就是指向GDT表,然后00100也就是4,代表着index索引是4

我们看windbg窗口,下断点以后输入dq gdtr

kd> dq gdtr
80b93800  00000000`00000000 00cf9b00`0000ffff
80b93810  00cf9300`0000ffff 00cffb00`0000ffff
80b93820  00cff300`0000ffff 80008bb9`3c0020ab
80b93830  804093b9`60004fff 0040f300`00000fff
80b93840  0000f200`0400ffff 00000000`00000000
80b93850  800089b9`5d200067 800089b9`5cb00067
80b93860  00000000`00000000 00000000`00000000
80b93870  800092b9`380003ff 00000000`00000000

我们拿到了当前DS段寄存器的段描述符是
00cff300`0000ffff 
根据段描述符结构图我们看高4字节
也就是00cff300
换算成二进制是:
0000 0000 1100 1111 1111 0011 0000 0000
其S位是1,也就是代表是用户模式
那现在我们更改一下
将其变成
0000 0000 1100 1111 1110 0011 0000 0000
换算成16进制也就是CF E300 
00cfe300
但是如果我们直接替换该处的段描述符可能会造成系统直接崩溃
所以我们选一个空的位置来写
80b93840  0000f200`0400ffff 00000000`00000000
这里的后面的0位置正好是空的,它的地址是80b93848(因为前面占用了8字节地址)
所以我们直接用Windbg修改内存

eq 80b93848 00cfe300`0000ffff
kd> dq gdtr
80b93800  00000000`00000000 00cf9b00`0000ffff
80b93810  00cf9300`0000ffff 00cffb00`0000ffff
80b93820  00cff300`0000ffff 80008bb9`3c0020ab
80b93830  804093b9`60004fff 0040f300`00000fff
80b93840  0000f200`0400ffff 00cfe300`0000ffff
80b93850  800089b9`5d200067 800089b9`5cb00067
80b93860  00000000`00000000 00000000`00000000
80b93870  800092b9`380003ff 00000000`00000000

我们看到内存被修改了80b93840  0000f200`0400ffff 00cfe300`0000ffff
这里我们计算一下段选择子的地址是多少
这里索引值是9,RPL是三环,TI是0,所以该段描述符的段选择子的地址是
0100 1011
也就是0x4B
然后我们回到开发编辑器中

运行以后发现触发读写异常

 

我们在windbg中再把S位改回去

 

 

然后再次运行程序

 程序恢复正常

安全初学者,如果有不对的地方多多见谅

 

 

 

posted @ 2025-04-01 10:12  溪辰  阅读(14)  评论(0)    收藏  举报