滴水内核中级班阶段测试题
题目1:
给定一个线性地址,和长度,读取内容:(运行环境XP)
目前:
可以修该页权限,获得PDE,PTE值,支持跨页检测,以及跨页设置页属性10-10-12)
后续:
补充读取内容 和 2-9-9-12分页模式,跨多页检测
题目要求:
int ReadMemory(OUT BYTE* buffer,IN DWORD dwAddr,IN DWORD dwLeght)要求:
1)可以自己指定分页方式.
2)页不存在,要提示,不能报错.
3)可以正确读取数据.
实现代码之前 务必使用windbg实现中断提权
kd> eq 8003f500 0040ee00`00081000
实现代码
//release版本 以及 项目属性中选固定基址
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
DWORD g_tmp=0,page_flag =0;
int flag = 0,pde = 0,pte = 0,ppte = 0;
DWORD dwAddr = 0,dwLeght= 0;
DWORD PDI,PTI,OFSET,PDI1,LPTE,LPPTE,LPDE;
//0x401000
void __declspec(naked) ReadMemory() //蓝色字体是告诉编译器函数代码自己去写,不需要编译器添加任何汇编代码
{__asm{mov edx,g_tmpcmp edx,0je P1cmp edx,3je P2cmp edx,1je P2jmp P3P2: mov ebx,ptemov ecx,pdeor ebx,4or ecx,4mov eax,LPTEmov dword ptr ds:[eax],ebx mov eax,LPDEmov dword ptr ds:[eax],ecx mov ecx,ppteor ecx,4mov eax,LPPTEmov dword ptr ds:[eax],ecx cmp edx,1je P1P3: mov ebx,ptemov ecx,pdeor ebx,2or ecx,2mov eax,LPTEmov dword ptr ds:[eax],ebx mov eax,LPDEmov dword ptr ds:[eax],ecxmov ecx,ppteor ecx,2mov eax,LPPTEmov dword ptr ds:[eax],ecx P1://判断PDE是否为0mov eax,0xC0300000add eax,PDI1mov LPDE,eaxmov eax,dword ptr ds:[eax]cmp eax,0jne L1mov eax,3mov flag,eaxjmp L2L1://判断PTE是否为0mov pde,eaxmov eax,0xc0000000add eax,PDIadd eax,PTImov LPTE,eaxmov LPPTE,eaxmov eax,dword ptr ds:[eax]mov pte ,eaxmov eax,LPPTEadd eax,4mov LPPTE,eaxmov eax,dword ptr ds:[eax]mov ppte ,eaxL2:iretd}}void go()
{__asm int 0x20 //触发异常
}int main()
{int a = 0x123456;BYTE* buffer = a;//scanf("%d",&dwLeght);printf("自带常量线性地址:%p\n\n\n",&a);printf("请输入目标地址:\n");scanf("%x",&dwAddr);printf("请输入读取长度:\n");scanf("%x",&dwLeght);PDI = dwAddr>>22;PTI = (dwAddr<<10)>>22;OFSET = dwAddr&0x0FFF;if((dwLeght+OFSET)>=1024){printf("读取数据的跨页存储!\n");page_flag = 1;}printf("PDI:%x\n",PDI);printf("PTI:%x\n",PTI);printf("OFFSET:%x\n",OFSET);PDI1 = PDI*4;PDI*=0x1000;PTI*=4;if((DWORD)ReadMemory !=0x401000){printf("wrong addr:%p",ReadMemory);exit(-1);}
RNG:go();//产生20中断,触发我们塞入20中断地址的函数。if(pde == 0|| pte ==0){printf("该页未被挂载!");return 0;}printf("%p\n",&a);printf("PDE:%x\n",pde);printf("PTE:%x\n",pte);if(page_flag == 1 && ppte!=0){printf("下页PTE:%x\n",ppte);}else if(ppte == 0){printf("下页PTE为NULL,读取数据范围错误! exitting!");return 0;}printf("是否操作该物理页?\n");printf("1.yes 2.no\n");scanf("%d",&flag);if(flag == 2)return 1;else if(flag == 1){printf("1.增加普通用户操作权限 \n");printf("2.增加写权限\n");printf("3.成年人的选择!\n");scanf("%d",&g_tmp);goto RNG;}elseprintf("输入错误,exitting!.");}
题目2
2.申请长度为100的DWORD的数组,且每项用该项的地址初始化;把这个数组所在的物理页挂到0x1000的地址上;
定义一个指针,指向0x1000这个页里的数组所在的地址,用0x1000这个页的线性地址打印出这数组的值;
目前:
完成
后续:
题目要求:
要求:
数组所在的物理页,是同一个物理页;
windbg跟上面一样的 命令
实现代码
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<winbase.h>int pde = 0,pte = 0,g_tmp = 0;
DWORD dwAddr = 0,dwLeght= 0;
DWORD PDI,PTI,OFSET,PDI1;
//0x401000
void __declspec(naked) ReadMemory() //蓝色字体是告诉编译器函数代码自己去写,不需要编译器添加任何汇编代码
{__asm{mov eax,0xc0300000add eax,PDI1mov eax,dword ptr ds:[eax]mov pde,eaxmov eax,0xC0000000add eax,PDIadd eax,PTImov eax,dword ptr ds:[eax]mov pte,eaxmov eax,0xC0300000mov ebx,pdemov dword ptr ds:[eax],ebxmov eax,0xc0000000add eax,0x4mov ebx,ptemov dword ptr ds:[eax],ebxiretd}}void go()
{__asm int 0x20 //触发异常
}int main()
{int i =0;DWORD *p1000=NULL;DWORD *str=NULL;DWORD dwAddr;if(&ReadMemory != 0x401000){printf("Error,ReadMemoryAddr:%p",&ReadMemory);}//固定大小申请空间,保证数组空间在同一物理页str = VirtualAlloc(0,1024,MEM_COMMIT,PAGE_EXECUTE_READWRITE);printf("当前数组线性地址:%p\n",str);//数组赋值for(i=0;i<100;i++){str[i] = &str[i];}//拆分线性地址dwAddr = str;PDI = dwAddr>>22;PTI = (dwAddr<<10)>>22;OFSET = dwAddr&0x0FFF;PDI1 = PDI*4;PDI*=0x1000;PTI*=4;printf("PDI:%p PTI:%p OFFSET:%p \n",PDI,PTI,OFSET);go();printf("挂载完成! 输入任意数字 显示0x1000线性地址内容:\n");scanf("%d",&g_tmp);p1000 = 0x1000;for(i=0;i<100;i++){printf("%p ",p1000[i]);}system("pause");return 1;
}
滴水内核中级班阶段测试题相关推荐
- c语言程序设计 滴水视频,编程达人滴水中级班视频教程
Java视频教程详情描述: <编程达人滴水中级班视频教程>编程达人来了,N部视频教程让你成为真正的编程达人,融会贯通将是本套视频最大的目的. Java视频教程目录: ├─APC机制 │ ...
- C语言数组测试函数,(完整word版)C语言数组与函数阶段测试题答案---(20200807070313)(8页)-原创力文档...
} } C语言数组与函数阶段测试题答案 一.选择题( 18*2=36 分) 1. 在定义" int a[5][6]; "后,第 11个元素是 [ C ] A.a[2][5] B . ...
- 计算机网络按信号频带占用方式分为,《计算机网络及组网技术》第2阶段测试题....
<计算机网络及组网技术>第2阶段测试题 一.名词解释(每小题5分,共20分) 1.网络体系结构 2.通信协议 3.协议数据单元 4.路由选择 二.选择题(每小题1分,共46分) 1.早期的 ...
- 云班课计算机第二阶段测试卷,云班课测试题答案
云班课测试题答案 更多相关问题 [单选] 秘书的接待工作应遵守以下原则,诚恳热情.讲究礼仪.周到细致.内外有别,确保安全和(). [单选] 电话按通话范围可分为(). [单选] 档案行政处罚的种类包括 ...
- “非IE内核浏览器”第一阶段开发计划发布
"非IE内核浏览器"第一阶段开发计划发布 "非IE内核浏览器"开发计划第一阶段计划如下: 1.第一阶段目标: 技术选型,并实 ...
- 左神算法中级班第三课[C++代码]
左神算法中级班第三课[C++代码] 第一题:流水线打包问题[阿里原题] 代码 第二题 代码 第三题:打印螺旋矩阵 代码 第四题 代码 第五题:判读aim是否在矩阵中 代码 第七题:topK问题 代码 ...
- an tu tu html5 test,法语TEF基础阶段测试题和答案(下)
1. Elle emprunte régulièrement des livres à la_____ municipale. A. salle B. banque C.bibliothèque D. ...
- an tu tu html5 test,法语TEF基础阶段测试题和答案[下]
1. Elle emprunte régulièrement des livres à la_____ municipale. A. salle B. banque C.bibliothèque D. ...
- 传智播客java就业班入学测试题(自测+答案)
---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- 传智播客java就业班入学测试题 ...
最新文章
- 凡科虚拟服务器怎样做301,虚拟主机301重定向怎么做?网站301重定向方法之一
- Python 爬取周杰伦instagram
- ABP VNext 微服务演示,项目状态和路线图
- 有关循环和判断的几个小问题
- 香农信息熵之可怜的小猪
- oracle数据库全数据库名,Oracle数据库中的 数据库域名、数据库名、全局数据库名、SID、数据库实例名、服务名 解释...
- c语言动态规划公共字符串,最长公共子串 C语言 动态规划
- 系统仿真平台SkyEye可替代国外Matlab/Sumlink等同类软件
- 开箱视频│ 能走!能跑!还能叠起来!金史密斯R1跑步机开箱
- iOS 5 Storyboard 学习之 Tabbar Controller,Navigation Controller
- Android之GPU过度绘制与图形渲染优化
- Java编程实现获取本机IP和计算机名的功能
- ThinkPad T470P拆机清灰教程
- SQL Server 数据库之数据约束
- 【Python K均值聚类算法】
- elasticsearch报错:exceeds the [index.highlight.max_analyzed_offset] limit [1000000]
- It is a distutils installed project and thus we cannot accurately determine [已解决]
- 天池- IJCAI-18 阿里妈妈搜索广告转化预测(完整版代码,数据集等总结)
- android 热更新 方案,与Android热更新方案Amigo的初次接触
- python 合并内容相同单元格
热门文章
- 关于 pygame中,检测按键按下
- 【正点原子FPGA连载】第三十一章RTC实时时钟数码管显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
- python 自动识别图形验证码
- C语言小白(5)——结束语句
- 70. Climbing Stairs. Iter--Sol
- 蓝牙BQB认证 - HFP profile配置说明
- 离谱:火狐浏览器重启后插件,书签,浏览记录全部没了???
- 乐鑫Esp32学习之旅11 入门 乐鑫esp-adf 音频框架开发,造一个蓝牙耳机,实现切换歌曲,获取歌曲信息等功能。(附带Demo)
- \t\t工信部:要求对网站主办者身份信息当面核验
- linux openssl 编译错误,“致命错误:openssl/opensslv.h:没有这样的文件或目录”编译mitmproxy...