0x001 实验环境
xp3
2-9-9-12 分页环境
0x002 时间代码
// 20180327_01.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
DWORD zero, one, two;
__declspec(naked)
void MountPageOnNull() {
...
PDE 和 PTE 地址计算公式
为了先入为主,这里直接给出访问一个线性地址的 PDE 和 PTT 的计算公式。PAE分页,把线性地址分成了四段,即PDPTI-PDI-PTI-OFFSET. 如果要找出这个线性地址对应的 PDE 和 PTE 的位置,可以使用下面的计算公式。
公式一不过,我们可以采用更简洁的方式来计算PDE和PTE的位置,这种方式不需要事先计算 PDPTI、PDI 和 PTI。
公式二
// addr 存放的是线性地址 pPDE = (int*)(0xc0600000 + ((addr >> 18...
知道了PDT和PTT的基址,那么PDE和PTE的基址就很容易得到,只要加上偏移就行了。
如果一个线性地址被拆分成三段式PDI-PTI-OFFSET,则有:
PDE 的基址
// 第 PDI 个 PDE 的基址
PDT[PDI] = 0xc0300000 + PDI * 4
1
2
PTE 的基址
// 第 PDI 个 PDE 指向的 PTT 中的第 PTI 个 PTE 的基址
PTE[PTI] = 0xc0000...
从上面的结构,发现 PDE 和 PTE 的结构基本上差不多,但是有个别比如第 7 位就不一样。
属性含义
P:有效位。0 表示当前表项无效。
R/W: 0 表示只读。1表示可读写。
U/S: 0 表示特技用户可访问,1表示普通用户可访问。
A: 0 表示该页未被访问,1表示已被访问。
D: 脏位。0表示该页未写过,1表示该页被写过。
PS: 只存在于页目录表。0表示这是4KB页,指向一个页表。1表示这是4MB大页,直接指向物理页。
PWT、PCD、G:暂不...
0x001 部署环境
eq 8003f500 0000e500`00c30000
eq 8003f0c0 0000e912`fdcc0068
0x002 测试代码
// 20180323_01.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
DWORD dwOK;
DWORD dwESP;
DWORD dwCS;...
0x001 TSS的基础知识
TSS是一段内存结构
char st[10] = {0}; // st 的地址是 0042b034
TSS tss = {// tss的地址是 0x00427b40
0x00000000,//link
(DWORD)st,//esp0
0x00000010,//ss0
0x00000000,//esp1
0x00000000,//ss1
0x00000000,//esp2
0x00000000,//ss2
0x00000000,//cr3
0x0040...
http://5sing.kugou.com/bz/3006614.html
原文地址: http://blog.csdn.net/q1007729991/article/details/52644720
除了使用调用门进行提权,本篇的中断门显的更加重要。因为在 Windows 中,大量使用了中断门。
中断门的结构
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 字节
|76543210|76543210|7 65 4 3210|76543210|76543210|76543210|76543210|76543210| 比特
|-----------------|1|--|0|1110|-...
IDT,Interrupt Descriptor Table,中断描述符表是CPU用来处理中断和程序异常的。
一、有关IDT的基本知识
1、中断时一种机制,用来处理硬件需要向CPU输入信息的情况。 比如鼠标,键盘等。
2、中断和异常的产生是随机的,在CPU正常运行过程中随时可能产生。CPU的中断处理机制
3、中断可以由硬件产生(称为外部中断),也可以由软件产生(称为内部中断),在程序中写入int n指令可以产生n号中断和异常(n从0-ffh)。
4、同时CPU的中断异常机制还是重要特性的支...
1) 当通过门,权限不变的时候,只会PUSH两个值:CS 返回地址
新的CS的值由调用门决定
2) 当通过门,权限改变的时候,会PUSH四个值:SS ESP CS 返回地址 新的CS的值由调用门决定 新的SS和ESP由TSS提供
3) 通过门调用时,要执行哪行代码有调用门决定,但使用RETF返回时,由堆栈中压人的值决定,这就是说,进门时只能按指定路线走,出门时可以翻墙(只要改变堆栈里面的值就可以想去哪去哪)
4) 可不可以再建个门出去呢?也就是用Call 当然可以了 前门进 后门出
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...