首页
社区
课程
招聘
[原创]10-10-12分页
2023-7-27 14:00 3491

[原创]10-10-12分页

2023-7-27 14:00
3491

1、10-10-12分页

在XP系统创建一个记事本文件,输入字符串Hello WorddADDDDD,通过CE找到该字符串的线性地址0106D8F8。
拆分线性地址: 0106D8F8
0000 0001 0000 0110 1101 8F8
0000 0001 00 -> 4*4 -> 10
00 0110 1101 -> 6D*4 -> 1B4
8F8

记事本进程notepad.exe的CR3: a3e05000

PDE = CR3 + 10 = a3e05010 -> [a3e05010] == 947b9867
基址: 947b9000
属性: 867

PTE = PDE.base +1B4 = 947b91b4 -> [947b91b4] = 1ce34867
基址: 1ce34000
属性: 867

物理地址 = PTE.base + 8F8 = 1ce348f8 -> 存储的字符串:Hello WorddADDDDD

2、实验

2.1 使得R3下的NULL地址能被读取到指定的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
 
int main(int argc, char* argv[])
{
    int* ptr = 0;
    int x = 111;
     
    printf("x的线性地址是:%x\n", &x);
     
    // 暂停程序,通过windbg挂载变量x的PTE到ptr上
    getchar();
 
    *ptr = 12345;
     
    printf("%d\n", *ptr);
     
    return 0;
}

拆分地址: 0x0
CR3: a0ff6000
PDE = CR3 + 0 = a0ff6000 -> [a0ff6000] == a5c55867
PTE = PDE.base + 0 = a5c55000 -> [a5c55000] == 00000000

拆分地址: 0x12ff78
0000 0000 0001 0010 1111 f78
0000 0000 00 -> 0*4 = 0
01 0010 1111-> 12F*4 = 4BC
F78

CR3: a0ff6000
PDE = CR3 + 0 = a0ff6000 -> [a0ff6000] == a5c55867

PTE = PDE.base + 4BC = a5c554bc -> [a5c554bc] = a525b867

将变量x的PTE值复制到ptr的PTE当中

恢复程序

该实验存在一个问题:
当通过windbg将x的PTE挂载到空指针ptr后,直接访问*ptr的值是一个未知数,为什么不是变量x的值123,而通过*ptr = 12345语句后*ptr的值变成了12345
问题分析:
当没有挂载PET时,直接访问*ptr时会报访问异常错误,说明此时ptr的PET还没有指向一个有效的物理地理
当挂载PET后,直接访问*ptr获得到一个未知数,说明这个时候已经拿到了物理地址上的一个随机值了
这说明ptr和x的物理地址不是同一个,所以ptr的值 != x的值
分析线性地址找到物理地址的流程后发现,ptr和x的PTE相同,但是PTE.base + 偏移 = 物理地址,二者的偏移不同导致了物理地址不一样
解决办法:
构造出一个物理地址偏移与空指针ptr相同的线性地址,再将该线性地址的PTE挂载到ptr就可以使得二者指向同一块物理地址

构造线性地址:0x0012F000
0000 0000 00 -> 0
0100 1011 11 -> 12F
000 -> 0 物理偏移
通过VirtualAlloc函数指定分配的地址即可

2.2 通过修改物理页属性使字符串常量可修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
 
int main(int argc, char* argv[])
{
    char* str = "Hello World";
 
    printf("线性地址:%x", str);
 
    getchar();     
 
    str[0] = 'A';
 
    printf("修改后的值:%s\n", str);
 
    return 0;
}

线性地址:0x00423044
0000 0000 01 -> 1*4 = 4
0000 1000 11 -> 23*4 = 8C
044

CR3: 1c3a1000
PDE = CR3 + 4 = 1c3a1004 -> [1c3a1004] == 82c67867
PTE = PDE .base + 8C = 82c6708c -> [82c6708c] == 9cc39025
修改PTE的R/W位=1 -> !ed 82c6708c 9cc39027
注意:物理地址的属性 = PDE属性 & PTE属性
其中R/W属性控制该地址的可读可写属性,PDE的R/W属性是1, PTE的R/W属性是0
返回执行代码


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2023-7-27 17:03 被ATrueMan编辑 ,原因: 图挂了
收藏
点赞1
打赏
分享
最新回复 (6)
雪    币: 378
活跃值: (2847)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
appview 2023-7-27 15:22
2
0
图挂了
雪    币: 914
活跃值: (2188)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
万剑归宗 1 2023-7-27 17:07
3
0
新的上分佬出现了
雪    币: 2140
活跃值: (3538)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
R0g 2 2023-7-27 19:19
4
0
新的上分佬出现了
雪    币: 1130
活跃值: (380)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ATrueMan 2023-7-28 09:22
5
0
上分佬是什么新梗
雪    币: 127
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
夏鱼儿 2023-8-4 16:25
6
0
你好,可以分享下可以用的符号吗?分页之后!process 一直用不了。万分感谢。
雪    币: 3823
活跃值: (5620)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huangjw 2023-8-4 16:39
7
0
真棒哦
游客
登录 | 注册 方可回帖
返回