0x01 调用门的基础知识 调用门执行流程 指令格式:CALL  CS:EIP(EIP是废弃的) 执行步骤: 1) 根据CS的值 查GDT表,找到对应的段描述符  这个描述符是一个调用门. 2) 在调用门描述符中存储另一个代码段段的选择子. 3) 选择子指向的段  段.Base + 偏移地址 就是真正要执行的地址. 0x02门描述符 0x03 构造调用门 eq 8003f048 0040EC00`00081020 0x0...

阅读全文>>

目录: (1) u命令(反汇编) (2) dt命令(查看数据结构) (3) ln命令(查找就近的符号) (4) x命令(显示模块的符号) (5) k命令(显示调用栈) (6) d命令(以数据方式显示) (7) b命令(断点) (8) lm lmvm (显示模块信息) (9) .reload (重加载模块) (10) !process !thread .process .thread (查看进程线程信息) (11) !object (查看对象信息) (1...

阅读全文>>

本质就是修改CS段寄存器 JMP 0x20:0x004183D7 CPU如何执行这行代码? (1) 段选择子拆分 0x20 对应二进制形式 0000 0000 0010 0000 RPL = 00    TI = 0 Index = 4 (2) 查表得到段描述符 TI = 0 所以查GDT表 Index = 4 找到对应的段描述符 四种情况可以跳转:代码段、调用门、TSS任务段、任务门 (3) 权限检查 如果是非一致代码段,要求:CPL == DPL 并且 RPL <= DPL 如果是一致代码段,要求:CP...

阅读全文>>

数据段的权限检查 参考如下代码: 比如当前程序处于0环,也就是说CPL=0 Mov ax,000B //1011   RPL = 3 Mov ds,ax //ax指向的段描述符的DPL = 0 数据段的权限检查: CPL <= DPL  并且 RPL <= DPL (数值上的比较) 注意: 代码段和系统段描述符中的检查方式并不一样,具体参加后面课程. 总结: CPL  CPU当前的权限级别 DPL  如果你想访问我,你应该...

阅读全文>>

0x001 读取GDT表 (删除部分 00000000 ) 0: kd> dq 8003f000 l 3ff 8003f000  00000000`00000000 00cf9b00`0000ffff 8003f010  00cf9300`0000ffff 00cffb00`0000ffff 8003f020  00cff300`0000ffff 80008b04`200020ab 8003f030  ffc093df`f0000001 0040f300`00000fff 8003f040  0000f200`040...

阅读全文>>

根据段描述符进行的拆分 S位 S = 1 代码段或者数据段描述符 S = 0 系统段描述符 S=1的TYPE域作用 A 访问位,表示该位最后一次被操作系统清零后,该段是否被访问过.每当处理器将该段选择符置入某个段寄存器时,就将该位置1. W 是否可写 E 扩展方向 A 访问位 R 可读位 C 一致位 C = 1 一致代码段 C = 0 非一致代码段 S=0 的时候 系统段的分类 直接...

阅读全文>>

0x001 搭建过程 vmware上安装干净版本的xp3, [记住一定要干净版本的, 我昨天用了我以前的一个xp !process命令一直不能使用] 把VirtualKD 的target目录 复制到 虚拟机中 运行 直接确定即可 本机打开: 配置调试器(找到windbg的位置,点击确定即可): 0x002 配置 符号表 重启虚拟机,运行, 会自动打开windbg 运行 g 命令 接着下载符号: S...

阅读全文>>

每个程序都有自己的LDT,但是同一台计算机上的所有程序共享一个GDT。LDT描述局部于每个程序的段,包括其代码、数据、堆栈等。GDT描述系统段,包括操作系统本身。 ①全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此积存器,从此以后,CPU就根据此寄存器中的内容作为G...

阅读全文>>