0x001 设置环境
eq 8003f048 0040EC03`00081030
0x002 测试代码
#include <windows.h>
#include <stdio.h>
DWORD x;
DWORD y;
DWORD z;
void __declspec(naked) GateProc()
{
__asm{
pushad
pushfd
mov eax,[esp+0x24+0x8+0x8]
mov DWORD ptr ds:[x],eax
mov eax...
直接上代码, 能看懂就理解了
记录一下
#include <windows.h>
#include <stdio.h>
BYTE GDT[6]={0};
DWORD dwH2GValue;
void __declspec(naked) GetRegister()
{
__asm{
pushad
pushfd
mov eax,0x8003f00c //读取高2G内存
mov ebx,[eax]
mov dwH2GValue,ebx
sgdt GDT; ...
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...
先记住几个结构
1、段寄存器的结构(96位)
Selector : 显示 16位 选择子
Attribute: 隐藏 属性16位
Base: 32位
Limit: 32位
2 段描述符 (GDT表)
r gdtr
r gdtl
一共64位,记住每个结构
3 段选择子
16位