zoukankan      html  css  js  c++  java
  • 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");
    }



  • 相关阅读:
    swift3.0更新内容
    Core Animation
    UIBezierPath精讲
    iOS-Core-Animation-Advanced-Techniques(原文来自cocoachina)
    iOS上图形和动画处理
    使用GCD(转自唐巧的技术博客)
    UITableView的cell的分割线位置
    swift深入理解闭包
    Swift控制器加载xib Swift Controller'view load from xib
    -[UIWindow viewForFirstBaselineLayout]: unrecognized selector sent to instance
  • 原文地址:https://www.cnblogs.com/leibso-cy/p/11719242.html
Copyright © 2011-2022 走看看