东莞市森旺酒店家具有限公司旗下网站

森旺

森旺 — 十年家具生产经验

工厂直卖不加价,材料工艺全透明

0769-81132026 13712466990
返回新闻列表页

涩涩视频在线观看地址-涩涩视频最新观看地址推荐

标签:


  心如刀绞的他只得倚在宫墙边哭泣。
  至于目的,司马昭之心,路人皆知,不愿意付这顿饭钱罢了。别的不知道,只知道富贵双眼通红,呼吸急促,富贵永远也忘不了那本书,爱里面的文字,更爱里面的插画,书名叫(新金瓶梅)。
  纪律规矩是马克思主义政党生存发展的生命线,也是做政治明白人的保证。虽然拍摄顺利完成,不过这位新娘却比以前黄心颖扮演的“大”了一个号。

不是没有人,是亲密的人你不能讲,陌生人你不好意思开口。羊市镇党委领导田书记表态,动员卢先生回本乡镇发展项目,并说没办法,我们已经尽力了……但最近卢先生对羊市镇党委领导田书记表态的事,却是很烦心事情。
  这让我感到不解,世上还能有什么,比人的性命更重要,仅仅为了一份保险,居然不惜痛下杀机,保险原本是防意外,事后希望有所补偿,如今有人因此丧命,看来保险怂恿犯罪。
  明日精选
  润达医疗(603108)外因严峻,内生强劲
  公司2022年或受主要经营区域疫情影响较大,但公司在高端自产产品、数字化系统取得突破显示持续的高研发投入已见成效,看好疫情影响消除后的长期成长能力。
  “你们这两货,真八婆。加油加油,坚持挖矿。
  因为当执行类似前面对段寄存器进行修改的指令:MOVDS,AX时,CPU会先查表,根据AX的值(段选择子)来决定查找GDT还是LDT
  但在Windows中LDT并没有被使用,于是AX的值(段选择子)是用来决定查询表中的哪个位置
  ***
  ##GDT
  ###什么是GDT
  GDT全称:GlobalDescriptorTable,为全局描述符表,表中存储的数据项为段描述符
  ***
  ###GDT的数量
  一个处理器对应一个GDT
  ***
  ###定位GDT
  大致了解了GDT是一张表,接下来则要定位到这张表,查看其内容
  想要定位GDT表的位置,可以通过gdtr寄存器来定位
  gdtr寄存器存储了GDT表的起始位置和GDT表的大小
  ***
  ###通过windbg定位GDT
  通过在windbg中输入下列指令查看有关GDT的信息:
  ```
  rgdtr//读取gdt表的起始位置
  rgdtl//读取gdt表的大小
  ```
  ***

  ***
  得到了:

  得到了GDT表的起始位置后,就可以查看GDT表的内容了:
  ```
  dq0x8003f000
  ```

  ***
  ##段描述符
  知道了查询的表为GDT后,再说说GDT表存储的数据项:段描述符
  ***
  ###什么是段描述符
  段描述符顾名思义就是用来描述段的信息的,每个段对应一个段描述符
  ***
  ###段描述符的数据宽度
  每个段描述符的数据宽度为:64位=8字节(QWORD)
  ***
  ###定位段描述符
  通过段选择子可以定位到对应的段描述符
  如何定位,则要先了解段选择子的结构
  ***
  ##段选择子
  ###什么是段选择子
  段选择子顾名思义就是用来选择段的,通过段选择子可以定位到对应的段描述符
  ***
  ###段选择子的结构

  ***

  ***
  ###**Index**
  索引,真正用来索引段描述符的数据
  ***
  ###TI
  表指示器,用来确定选择GDT(全局描述符表)还是LDT(局部描述符表)

  在Windows上并不使用LDT表,故TI恒等于0
  ***
  ###RPL
  请求的特权等级,会和请求的段描述符的特权等级进行比较,留作后续补充说明
  ***
  ###根据段选择子定位段描述符
  了解了段选择子的结构后,就可以通过段选择子来定位段描述符了
  例子:以段选择子=0x001B为例
  首先将段选择子转换为二进制:0000000000011011
  将其按段选择子的结构填入:

  拿到索引之后就可以定位对应的段描述符了得到的索引为3
  对应的段描述符地址=GDT表首地址+索引×段描述符长度=GDT表首地址+索引×8(注意这里的单位为字节,64位=8字节)
  所以:对应的段描述符地址=0x8003f000+3×8=0x8003f000+24=0x8003f000+0x18=0x8003f018

  ***
  ##加载段描述符至段寄存器
  除了MOV指令,还可以使用LES、LSS、LDS、LFS、LGS指令修改寄存器.
  CS不能通过上述的指令进行修改,CS为代码段,CS的改变会导致EIP的改变,要改CS,必须要保证CS与EIP一起改,在后续的笔记会提到
  ***
  下面以lds为例子,观察指令执行前后寄存器的变化
  ```
  #include<stdio.h>
  #include<windows.h>
  charbuffer[6]={0x44,0x33,0x22,0x11,0x1B,0x00};
  intmain(){
  _asm{
  pushds
  ldseax,fwordptrds:[buffer]//fword为6字节
  popds
  }
  return0;
  }
  ```
  ***
  ###下断点观察

  ***
  ###执行前

  ***
  ###执行后

  ***
  ###对比执行前后

  ***
  ###得出指令功能
  LDS指令格式为:LDSOPRD1,OPRD2
  OPRD1用来接收OPRD2的低(OPRD2)字节
  OPRD2的高2字节为段选择子,通过段选择子修改DS
  其它指令:LES、LSS、LFS、LGS也是一样的格式,只不过修改的段寄存器不同罢了
  ***
  ##内存寻址关系一览图
  下面给出内存寻址的流程中,GDT、段描述符、段选择子的关系图:

  ***
  以MOVEAX,DWORDPTRDS:[0x123456]为例
  根据DS获得SegmentSelector(段选择子):0x23(在逆向脱壳之保护模式学习二段寄存器中获得的,不同机器可能不同)
  根据地址获得Offset(偏移):0x123456
  然后通过段选择子查询GDT(全局描述符表)得到对应的SegmentDescriptor(段描述符)
  通过段描述符可以得到Base(基地址)=0(DS段寄存器的Base为0)
  最终要访问的内存地址为:Base+Offset=0+0x123456=0x123456(期间也会根据段描述符进行一系列校验,这里暂且不提)
  ***
  ##说明
  该篇笔记主要介绍了如何通过段选择子定位到对应的段描述符并补充了段选择子的结构和修改段寄存器的指令
  但关于段描述符的结构还没有深入介绍
  前面引出的问题也尚未完全解决,通过前面的学习得知段寄存器剩下的80位是通过段描述符来填充的
  但是段描述符的长度只有64位,如何填充80位。又赶上了不再分房,一切都要靠自己。

返回顶部