滴水内核中级班阶段测试题

题目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_tmp
		cmp edx,0
		je P1

		cmp edx,3
		je P2
		cmp edx,1
		je P2
		jmp P3

P2:		mov ebx,pte
		mov ecx,pde
		or ebx,4
		or ecx,4

		mov eax,LPTE
		mov dword ptr ds:[eax],ebx	
		mov eax,LPDE
		mov dword ptr ds:[eax],ecx	

		mov ecx,ppte
		or ecx,4
		mov eax,LPPTE
		mov dword ptr ds:[eax],ecx	
		
		cmp edx,1
		je P1
		

P3:		mov ebx,pte
		mov ecx,pde
		or ebx,2
		or ecx,2
		
		mov eax,LPTE
		mov dword ptr ds:[eax],ebx	
		mov eax,LPDE
		mov dword ptr ds:[eax],ecx
		


		mov ecx,ppte
		or ecx,2
		mov eax,LPPTE
		mov dword ptr ds:[eax],ecx	

		

P1:
		//判断PDE是否为0
		mov eax,0xC0300000
		add eax,PDI1
		mov LPDE,eax
		mov eax,dword ptr ds:[eax]
		cmp eax,0
		jne L1

		mov eax,3
		mov flag,eax
		jmp L2
		
L1:
		//判断PTE是否为0
		mov pde,eax
		mov eax,0xc0000000
		add eax,PDI
		add eax,PTI
		mov LPTE,eax
		mov LPPTE,eax
		mov eax,dword ptr ds:[eax]
		mov pte ,eax
		
		
		mov eax,LPPTE
		add eax,4
		mov LPPTE,eax
		mov eax,dword ptr ds:[eax]
		mov ppte ,eax
	
L2:
		
		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;
	}
	else
		printf("输入错误,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,0xc0300000
		add eax,PDI1
		mov eax,dword ptr ds:[eax]
		mov pde,eax

		mov eax,0xC0000000
		add eax,PDI
		add eax,PTI
		mov eax,dword ptr ds:[eax]
		mov pte,eax
		


		
		mov eax,0xC0300000
		mov ebx,pde
		mov dword ptr ds:[eax],ebx
		
		mov eax,0xc0000000
		add eax,0x4
		mov ebx,pte
		mov dword ptr ds:[eax],ebx

		iretd
	}
	
}

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;
}

在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本资源为非常不错的一套王网传资源,是继之前上传的基础班的升级版,更加全面,资源过大,上传乃是下载链接,如失效请留言!!!资源远大于5积分,不多说,下面直接上目录: APC机制 I5 J$ i: U0 f1 r: O9 B( Q" b │ 01 APC的本质.mp4 │ 02 备用Apc队列.mp4: U8 p7 ]3 f" w$ b0 ?5 Z9 `0 H8 G* [ │ 03 APC挂入过程.mp48 g! H4 s1 V; ]+ b4 Y9 H0 L- B │ 04 内核APC执行过程.mp4 │ 05 用户APC执行过程.mp4 │ ├─事件等待' x% `" J' } ?& S: t' ]# I5 \5 G │ 01临界区.mp4- o( U$ W9 O+ ` ~0 u4 ~, @. \ │ 02 自旋锁.mp4) c3 ~. J& L, V& s. Q8 x/ [. w │ 03 线程等待与唤醒.mp4# b* ^" k$ d# O3 f8 t8 a3 k │ 04 WaitForSingleObject函数分析.mp4$ V7 L' C3 I( W │ 05 事件.mp4 │ 06 信号量.mp4 │ 07 互斥体.mp4 │ ├─保护模式- }! n! C$ O/ s" Q │ 014 中断门.mp4, B' i, r7 Y: B3 |! N( ^6 { l9 F │ 015 陷阱门.mp4 │ 017 任务段_下.mp4, |/ M# A: K3 T7 i* Q/ ? I& o& D; p │ 018 任务门.mp46 m. D+ f4 _/ V) ~9 S& B │ 019 10-10-12分页.mp4 │ 020 PDE_PTE.mp4 │ 021 PDE_PTE属性(P_RW).mp43 ~/ ]1 x5 {4 u: {$ I │ 022 PDE_PTE属性(US_PS_A_D).mp4 │ 023 页目录表基址.mp4 │ 024 页表基址.mp4$ A f' [+ g6 }5 F; e │ 025 2-9-9-12分页.mp4 │ 026 2-9-9-12分页(下).mp4- ~' ~9 i0 T5 f" p2 U$ j │ 027 TLB.mp4 │ 028 中断与异常.mp4 │ 029 控制寄存器.mp46 j2 l3 j) O# {% {4 w │ 030 PWT_PCD属性.mp4 │ 031 保护模式阶段测试.mp4 │ _001 保护模式.mp4, I; c5 X ~) t1 d1 }8 S# f3 i: b │ _002 段寄存器结构.mp48 n- |- i( H$ ^* f │ _003 段寄存器属性探测.mp4 │ _004 段描述符与段选择子.mp4 │ _005 段描述符属性_P位_G位.mp4 │ _006 段描述符属性_S位_TYPE域.mp4 │ _007 段描述符属性_DB位.mp4 │ _008 段权限检查.mp4 │ _009 代码跨段跳转流程.mp4& S# i9 i- \0 D" @1 U- P │ _010 代码跨段跳转实验.mp4" @* S2 Y- a- S6 n7 n: ~ │ _011 长调用与短调用.mp4 │ _012 调用门_上.mp4; [) _2 c8 A5 F% }! u% ]: ~. N │ _013 调用门_下.mp4 │ ├─内存管理 │ 01 线性地址的管理.mp4; ? |+ ^5 i& } │ 02 Private Memory.mp4* @3 B( Y6 ^ y- { │ 03 Mapped Memory.mp4 │ 04 物理内存的管理.mp4' [8 C6 q \1 H8 w" H2 ]0 Y │ 05 无处不在的缺页异常.mp4 │ ├─句柄表 │ 01 句柄表.mp4 │ 02 全局句柄表.mp4 │ 5 h" u" i& {+ G4 T+ E ├─异常 │ 01 CPU异常记录.mp4 │ 02 模拟异常记录.mp4: K0 J( d1 n4 ] Q │ 03 内核异常的处理流程.mp4 │ 04 用户异常的分发.mp4 │ 05 VEH.mp4 C F6 A% j# M* @- h% N │ 06 SEH.mp4 │ 07 编译器扩展SEH课堂代码_1.mp42 I" @1 i1 b% G6 o4 O% j: t │ 08 编译器扩展SEH_2.mp4 │ 09 编译器扩展SEH_3.mp4 │ 10 编译器扩展SEH_4.mp4 │ 11 未处理异常.mp4. m' z+ `$ v- R/ K. `/ \2 M, S │ ├─消息机制0 y7 o3 ?7 X7 Z, F" I( Q │ 01 消息队列在哪.mp4$ {& n5 ]* g' H, W# k6 |+ M │ 02 窗口与线程.mp4 │ 03 消息的接收.mp4- a8 k- Q8 {! I* T8 L7 j │ 04 消息的分发.mp4- M* `$ q% z, y, R │ 05 内核回调机制.mp4 │ 0 ]( v: v$ e% _/ v, e ├─系统调用: |5 y7 Y% q' w, J │ 001 API函数的调用过程(3环部分).mp4; }0 Z8 P$ g# I6 \! _ y │ 002 API函数的调用过程(3环进0环 上).mp4- g. o" u+ M1 Y) x │ 003 API函数的调用过程(3环进0环 下).mp46 p* w2 @* j9 ?% Z3 e$ \: ? │ 004 API函数的调用过程(保存现场).mp44 G8 |/ j3 ^8 ?1 D9 Y │ 005 API函数的调用过程(系统服务表).mp4 │ 006 API函数的调用过程(SSDT).mp4 │ ! A- ~, L8 M. l ├─软件调试% a8 o, z* m) E$ M( \" P D! m7 x4 B │ 01 调试对象.mp4 c- K+ k3 F( v3 p2 R9 E$ n$ f: Z6 k) @ │ 02 调试事件的采集.mp4 │ 03 调试事件的处理.mp4( w" W. m) o: D3 P7 ? │ 04 异常的处理流程.mp4 │ 05 软件断点.mp4 │ 06 内存断点.mp4 │ 07 硬件断点.mp4 │ 08 单步异常.mp4% P5 e* U+ M# a1 j3 D6 n; n │ 09 单步步过.mp4 │ 10 硬件HOOK过检测.mp46 H5 q2 K& X1 u$ ]/ E │ ├─进程与线程 │ 001 进程结构体.mp4 │ 002 线程结构体.mp41 `5 e+ [1 U) j │ 003 KPCR.mp4 │ 004 等待链表_调度链表.mp41 m! T& `3 t' U& U# A- @+ _ │ 005 模拟线程切换.mp4& ?, D% H/ z- d# _& \$ X- X$ U │ 006 Windows线程切换_主动切换.mp4 │ 007 Windows线程切换_时钟中断切换.mp4/ s& N% Y5 B" @2 g │ 008 Windows线程切换_时间片管理.mp48 X( v. g" T0 ~- k! v* Q │ 009 Windows线程切换_TSS.mp4 n+ A9 L5 B2 t* M# H │ 010 Windows线程切换_FS.mp4 │ 011 Windows线程切换_线程优先级.mp4 A! a% n1 c. Y5 y# ~ L4 P │ 012 进程挂靠.mp4 │ 013 跨进程读写内存.mp4, E0 ^0 U I1 h │ $ {. ?; O) C* w1 K. q) K └─驱动开发 01 驱动开发环境配置.mp4* W) g2 z& T/ _; @1 V" n 02 第一个驱动程序.mp4 03 如何调试驱动程序.mp4; [8 U2 T) B' V 04 内核编程基础.mp4 05 内核空间与内核模块.mp4 06 0环与3环通信(常规方式).mp46 O: Z; `3 `( L 07 SSTD HOOK.mp46 D t( {, u1 D/ x) h! ]: g 08 Inline Hook.mp4 09 多核同步之临界区.mp40 l& ^, e3 J( E1 d( b2 S 10 多核同步之自旋锁.mp4 11 重载内核
第1讲:2015-01-12(进制01) 第2讲:2015-01-13(进制02) 第3讲:2015-01-14(数据宽度-逻辑运算03) 第4讲:2015-01-15(通用寄存器-内存读写04) 第5讲:2015-01-16(内存寻址-堆栈05) 第6讲:2015-01-19(EFLAGS寄存器06) 第7讲:2015-01-20(JCC) 第8讲:2015-01-21(堆栈图) 第8讲:2015-01-21(宝马问题) 第9讲:2015-01-22(堆栈图2) 第10讲:2015-01-23(C语言01_后半段) 第10讲:2015-01-23(C语言完整版) 第11讲:2015-01-26(C语言02_数据类型) 第12讲:2015-01-27(C语言03_数据类型_IF语句) 第13讲:2015-01-28(C语言04_IF语句逆向分析上) 第14讲:2015-01-28(C语言04_IF语句逆向分析下) 第15讲:2015-01-29(C语言04_正向基础) 第16讲:2015-01-30(C语言05_循环语句) 第17讲:2015-02-02(C语言06_参数_返回值_局部变量_数组反汇编) 第18讲:2015-02-02(2015-01-30课后练习) 第19讲:2015-02-03(C语言07_多维数组) 第20讲:2015-02-03(2015-02-02课后练习) 第21讲:2015-02-04(C语言08_结构体) 第22讲:2015-02-05(C语言09_字节对齐_结构体数组) 第23讲:2015-02-06(C语言10_Switch语句反汇编) 第24讲:2015-02-26(C语言11_指针1) 第25讲:2015-02-27(C语言11_指针2) 第26讲:2015-02-28(C语言11_指针3) 第27讲:2015-02-28(C语言11_指针4) 第28讲:2015-03-02(C语言11_指针5) 第29讲:2015-03-03(C语言11_指针6) 第30讲:2015-03-04(C语言11_指针7) 第31讲:2015-03-06(C语言11_指针8) 第32讲:2015-03-09(位运算) 第33讲:2015-03-10(内存分配_文件读写) 第34讲:2015-03-11(PE头解析_手动) 第35讲:2015-03-12(PE头字段说明) 第36讲:2015-03-13(PE节表) 第37讲:2015-03-16(FileBuffer转ImageBuffer) 第38讲:2015-03-17(代码节空白区添加代码) 第39讲:2015-03-18(任意节空白区添加代码) 第40讲:2015-03-19(新增节添加代码) 第41讲:2015-03-20(扩大节-合并节-数据目录) 第42讲:2015-03-23(静态连接库-动态链接库) 第43讲:2015-03-24(导出表) 第44讲:2015-03-25(重定位表) 第45讲:2015-03-26(移动导出表-重定位表) 第46讲:2015-03-27(IAT表) 第47讲:2015-03-27(导入表) 第48讲:2015-03-30(绑定导入表) 第49讲:2015-03-31(导入表注入) 第50讲:2015-04-01(C++ this指针 类 上) 第51讲:2015-04-01(C++ this指针 类 下) 第52讲:2015-04-02(C++ 构造-析构函数 继承) 第53讲:2015-04-03(C++ 权限控制) 第54讲:2015-04-07(C++ 虚函数表) 第55讲:2015-04-08(C++ 动态绑定-多态-上) 第56讲:2015-04-08(C++ 动态绑定-多态-下) 第57讲:2015-04-09(C++ 模版) 第58讲:2015-04-10(C++ 引用-友元-运算符重载) 第59讲:2015-04-13(C++ new-delete-Vector) 第60讲:2015-04-14(C++Vector实现) 第61讲:2015-04-15(C++链表) 第62讲:2015-04-16(C++链表实现) 第63讲:2015-04-16(C++二叉树) 第64讲:2015-04-17(C++二叉树实现) 第65讲:2015-04-20(Win32 宽字符) 第66讲:2015-04-21(Win32 事件-消息-消息处理函数) 第67讲:2015-04-22(Win32 ESP寻址-定位回调函数-条件断点) 第68讲:2015-04-23(Win32 子窗口-消息处理函数定位) 第69讲:2015-04-24(Win32 资源文件-消息断点) 第70讲:2015-04-27(Win32 提取图标-修改标题) 第71讲:2015-04-28(Win32 通用控件-VM_NOTIFY) 第72讲:2015-04-29(Win32 PE查看器-项目要求) 项目一:PE查看器 开发周期(5天) 需求文档 第73讲:2015-05-07(Win32 创建线程) 第74讲:2015-05-08(Win32 线程控制_CONTEXT) 第75讲:2015-05-11(Win32 临界区) 第76讲:2015-05-12(Win32 互斥体) 第77讲:2015-05-13(Win32 事件) 第78讲:2015-05-14(Win32 信号量) 第79讲:2015-05-15(Win32 线程同步与线程互斥) 第80讲:2015-05-18(Win32 进程创建_句柄表) 第81讲:2015-05-20(Win32 以挂起形式创建进程) 第82讲:2015-05-21(Win32 加密壳_项目说明) 项目二:加密壳 开发周期(5天) 需求文档 第83讲:2015-05-28(Win32 枚举窗口_鼠标键盘事件) 第84讲:2015-05-29(Win32 CE练习) 第85讲:2015-06-01(Win32 OD练习) 第86讲:2015-06-03(Win32 ShellCode_远程线程注入) 第87讲:2015-06-04(Win32 加载EXE_模块隐藏) 第88讲:2015-06-09(Win32 IAT_HOOK) 第89讲:2015-06-10(Win32 InlineHook) 第90讲:2015-06-11(Win32 进程通信) 第91讲:2015-06-11(Win32 进程监控_项目说明) 项目三:进程监控 开发周期(5天) 需求文档 第92讲:2015-06-15(硬编码_01) 第93讲:2015-06-16(硬编码_02) 第94讲:2015-06-17(硬编码_03) 第95讲:2015-06-18(硬编码_04) 第96讲:2015-06-19(硬编码_05)
sicore.sys滴水中级ida训练逆向训练完全版是一种针对sicore.sys驱动程序的逆向工程训练工具的完整版本。Sicore.sys是一种设备驱动程序,负责处理与硬件设备的通信和控制。通过逆向训练,我们可以深入了解这个驱动程序的工作原理,以及其中的漏洞和安全风险。 逆向训练是指通过分析可执行文件的代码和逻辑,了解其运行方式、功能和特性的过程。在逆向训练中,我们使用IDA工具来反汇编和分析sicore.sys驱动程序的二进制代码。 滴水中级IDA训练是指基于逆向工程领域的滴水攻击技术,通过制作一系列的逆向工程训练题目,帮助学习者提高逆向工程的技能。在这个训练中,我们将使用IDA工具进行逆向分析,掌握逆向工程的相关技术和方法。 逆向训练的过程中,我们将学习如何使用IDA工具进行代码分析、反汇编和调试。通过分析sicore.sys驱动程序的代码,我们可以发现潜在的漏洞和安全风险,从而提高系统的安全性。 逆向训练还可以帮助我们理解复杂的驱动程序的功能和逻辑,从而加深我们对系统内部工作原理的理解。通过逆向训练,我们可以进一步提高我们的逆向工程技能,并将其应用于软件安全、恶意代码分析等领域。 总之,sicore.sys滴水中级ida训练逆向训练完全版是一种使用IDA工具对sicore.sys驱动程序进行逆向分析、漏洞挖掘和安全评估的完整版本的培训工具。通过逆向训练,我们可以提高我们的逆向工程技能,并加深对驱动程序工作原理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值