段寄存器详解:
段寄存器分8个:ds,ss,cs,es,fs,gs,ldtr,tr
回想我们写汇编的时候我们对一处内存进行操作时举个移动的例子吧
mov dword ptr ds:[0x35687],eax
实际我们的地址是ds+0x35687
我们使用栈空间时使用的是ss段寄存器,访问内存数据段的时候是使用的ds寄存器进行访问,我们使用ds寄存器对数据段进行操作时在cpu角度上有权限描述我们在使用es对附加段进行源数据与目标数据进行操作时有也权限描述,我们的段选择子都是一样的都是002b
cs代码段寄存器又是0023,我们的fs寄存器的则是0053
我们学过汇编的都知道我们这句指令的意思是把eax的值给到35687这个地址这,那我把35687改成800000这种高地址我们还能这样搞显然不能会直接报错,那为什么会报错呢,换句话说就是是什么原因导致的报错呢。
这个我们就要说到我们刚刚提到的002b,的这个东西了,这个002b它是有个含义的拆成二进制我们就知道了,0000 0000 0010 1011 后3位 011 11这个东西是RPL(请求权限级别) 后两位又有4个标识,0代表是0环的最大权限请求 1,2,3,4分别代表处于的环,我这个是处于在3环的代码那它的请求级别就是3 ,前面0的含义又是什么呢。
查的表,表有两张一张ldt,一张gdt,这个ldt里面就是段选择子,gdt是张总表,代码怎么去执行操作什么数据查的都是gdt这张表 那现在我们就应该知道 11是3环请求级别 0是查gdt,这个段选择子去执行代码或者说是操作数据时都会去对gdt表进行查询,查询结果为1的话会执行lldt装载某一个ldt,之后段选择子会在gdt表里找ldt,之后的操作大致为判断选择子然后到ldt里去寻找要执行的指令。
过程大致为:ds=2b 0010 1011 00101为索引,0为查询哪张表,11为权限
0我们到gdt表进行查询,查询位置公式为:段选择子=gdt首地址+HEX(5*8)
我们对段寄存器读的值为16位,写的值为96位
我们接着看看段寄存器的结构体
struct segment
{
word slector
word atrribute
dword base
dword limit
}
这篇文章内容大概就是这样
下一篇讲段寄存器的探测了
来源:freebuf.com 2021-05-01 14:06:55 by: pwnter
请登录后发表评论
注册