保护模式(段寄存器属性探测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寄存器
*/