• 11_零地址读写


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

    1570372942798[4]

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

    测试结果:

    这里不知道为什么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 ", * (DWORD*)0x403000);

    printf("var: %d ", 0x1);
    printf("var: %p ", g_var);
    printf("out: %p ", g_out);
    printf("var: %p ", *(DWORD *)(0x4197b0));
    system(" pause");
    }



  • 相关阅读:
    Python基础之zip和enumerate
    python3中map()函数用法
    python列表推导式
    python面试常问的几个内置装饰器:@staticmethod、@classmethod和@property
    linux的解压与压缩
    python中 s f各种转移字符含义
    fixture 调用函数名传参(转载)
    3.css选择器
    实战有感3
    实战有感2-轮播图
  • 原文地址:https://www.cnblogs.com/leibso-cy/p/11719242.html
Copyright © 2020-2023  润新知