11_零地址读写

原理: 修改 进程空间 虚拟 零地址 的 pte 为 一个当前程序的全局变量;这样 零地址 指向的就是 同一个物理页且属性相同;修改 一个虚拟地址数据;另外的虚拟地址数据同样会改变。

注意: 中间加阴影的部分 是为了刷新 TLB 快表,后面章节有详解。

测试结果:

这里不知道为什么printf时候 我的 exception handler 4 检测异常;导致输出不了;但是的确0页 映射到了 和全局变量同一个物理页。

代码:

// 5_进程空间虚拟零地址读写.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

//

#include "pch.h"

#include

#include

#include

#define PTE(x) ((DWORD *)(0xc0000000 + ((x>> 12)<< 3)))

#define PDE(x) ((DWORD *)(0xc0600000 + ((x >> 21) << 3)))

//0x4197b0

DWORD g_var = 0x12345678;

DWORD g_out;

//0x401040

void _declspec(naked) IdtEntry()

{

PTE(0)[0] = PTE(0x4197b0)[0] ;

PTE(0)[1] = PTE(0x4197b0)[1];

__asm {

mov eax, cr3

mov cr3, eax

}

g_out = *(DWORD*)0x7b0;

*(DWORD*)0x7b0 = 0x11111111;

__asm {

// 问题 所在 ,, fs 出错了 ,既然这里可以复制过去能成功;那么应该是前面的 修改 导致了fs 错误。

push 0x3b;

pop fs;

iretd

}

}

void _declspec(naked) go()

{

g_var = 0x2222222;

__asm {

int 0x20

ret

}

}

//eq 8003f500 0040ee00 081000

void main()

{

if ((DWORD)IdtEntry != 0x401040)

{

printf("wrong addr: sp", IdtEntry);

exit(-1);

}

go();

//printf("out: %p\n", * (DWORD*)0x403000);

printf("var: %d\n", 0x1);

printf("var: %p\n", g_var);

printf("out: %p\n", g_out);

printf("var: %p\n", *(DWORD *)(0x4197b0));

system(" pause");

}

//

#include "pch.h"

#include

#include

#include

#define PTE(x) ((DWORD *)(0xc0000000 + ((x>> 12)<< 3)))

#define PDE(x) ((DWORD *)(0xc0600000 + ((x >> 21) << 3)))

//0x4197b0

DWORD g_var = 0x12345678;

DWORD g_out;

//0x401040

void _declspec(naked) IdtEntry()

{

PTE(0)[0] = PTE(0x4197b0)[0] ;

PTE(0)[1] = PTE(0x4197b0)[1];

__asm {

mov eax, cr3

mov cr3, eax

}

g_out = *(DWORD*)0x7b0;

*(DWORD*)0x7b0 = 0x11111111;

__asm {

// 问题 所在 ,, fs 出错了 ,既然这里可以复制过去能成功;那么应该是前面的 修改 导致了fs 错误。

push 0x3b;

pop fs;

iretd

}

}

void _declspec(naked) go()

{

g_var = 0x2222222;

__asm {

int 0x20

ret

}

}

//eq 8003f500 0040ee00 081000

void main()

{

if ((DWORD)IdtEntry != 0x401040)

{

printf("wrong addr: sp", IdtEntry);

exit(-1);

}

go();

//printf("out: %p\n", * (DWORD*)0x403000);

printf("var: %d\n", 0x1);

printf("var: %p\n", g_var);

printf("out: %p\n", g_out);

printf("var: %p\n", *(DWORD *)(0x4197b0));

system(" pause");

}

网购的空调怎么安装?如何正确安装网购空调以确保安全和效率? 粵音資料集叢
top