11_零地址讀寫

原理: 修改 進程空間 虛擬 零地址 的 pte 爲 一個當前程序的全局變量;這樣 零地址 指向的就是 同一個物理頁且屬性相同;修改 一個虛擬地址數據;另外的虛擬地址數據一樣會改變。web

1570372942798[4]

注意: 中間加陰影的部分 是爲了刷新 TLB 快表,後面章節有詳解。ide

測試結果:

這裏不知道爲何printf時候 個人 exception handler 4 檢測異常;致使輸出不了;可是的確0頁 映射到了 和全局變量同一個物理頁。函數

1570414079132[4]

代碼:

// 5_進程空間虛擬零地址讀寫.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。
//

#include "pch.h"
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>

#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");
}

相關文章
相關標籤/搜索