保护模式(段寄存器属性探测2)

要点回顾:

          上一节课我们知道了段寄存器共96位
          Selector//16位
          Attribute//16位
          Base     //32位
          Limit    //32位
          我们可以通过MOV指令进行读写(LDTR和TR除外)
          但是我们只能看见16位,那我们证明Attribute,Base,Limit的存在呢?

段寄存器成员的简介:


CS的属性为可读可执行,而其余它的段寄存器为可读,可写的。
FS的BASE为0x7FFDEEE0,而其余它的段寄存器为0
FS段Limit为0xFFF,而其余它的段寄存器为0XFFFFFFFF

探测Attribute

#include "stdafx.h"
int var = 0; //
int main(int argc, char* argv[])
{
	__asm
	{
		mov ax,ss  //这句话是将ss段的内容 读取 到ax中。
		mov ds,ax	//将ax的值  写入  到ds当中。
		mov dword ptr ds:[var],eax
	}
	return 0;
}

/*
可读 是将原操作数(ss段寄存器) 读取到目标操作数(ax寄存器)当中
可写 是将原操作数(ax寄存器) 写入到目标操作数(ds段寄存器)当中
*/


探测cs段寄存器的属性:

#include "stdafx.h"
int var = 0; 
int main(int argc, char* argv[])
{
	__asm
	{
		mov ax,ss  //这句话是将ss段的内容 读取 到ax中。
		mov cs,ax	//将ax的值  写入  到cs当中。
	}
	return 0;
}

/*
可读 是将原操作数(ss段寄存器) 读取到目标操作数(ax寄存器)当中
可写 是将原操作数(ax寄存器) 写入到目标操作数(cs段寄存器)当中
可执行 是指当前的段可以赋给EIP寄存器
*/


探测base:

#include "stdafx.h"
int var = 0; 
int main(int argc, char* argv[])
{
	__asm
	{
		mov ax,fs  //这句话是将ss段的内容 读取 到ax中。
		mov gs,ax	//将ax的值  写入  到cs当中。
		mov eax,gs:[0]//0地址是没有办法读和写的,但是编译运行后也没有报错,说明读取的不是0地址而是gs.base+0	
	}
	return 0;
}

探测limit:

#include "stdafx.h"
int var = 0; 
int main(int argc, char* argv[])
{
	__asm
	{
		mov ax,fs  //这句话是将fs段的内容 读取 到ax中。
		mov gs,ax	//将ax的值  写入  到gs当中。
		//mov eax,gs:[0x10000000000000000]//	fs.base+1000  = f.base +0x10000000000000000这个无法读取,因为我是在64位机器上调试的可能limit的长度大小跟32位的不一样,这还是一个疑问
		  mov eax,gs:[0x1999999999999999]//这个可以读取,说明有了界限
	}
	return 0;
}

/*
可读 是将原操作数(ss段寄存器) 读取到目标操作数(ax寄存器)当中
可写 是将原操作数(ax寄存器) 写入到目标操作数(ds段寄存器)当中
可执行 是指当前的段可以赋给EIP寄存器
*/

posted @ 2021-11-05 17:15  不会笑的孩子  阅读(59)  评论(0编辑  收藏  举报