
内核系列实验
感谢周壑老师,本文基于周壑老师的讲解
leibso
不忘初心,方得始… 停停停初心是啥?
展开
-
17_页面异常接管
页面异常捕获过滤:原理:在 IDT 表中的e 号 处理 是 页面异常处理; 如果 我们 hook 掉 这个回调函数;那么就能获得全部的页面异常;再通过 cr3 对比 捕获指定的 cr3 (进程)的信息;最后再共享的区域将数据输出;然后测试程序获取该自己的页面异常信息;实验中 容易出现的错误:在 c 的时候注意将使用的寄存器(这里是eax)先保存起来;注意 通过栈保存 eax...原创 2019-10-22 13:33:00 · 287 阅读 · 0 评论 -
16_TLB与流水线
1 前面做的实验起始有缺陷访问内存之后,后面执行两句代码后;并不能保证刚才访问的代码还在TLB中;有可能被刷新出去了;实验验证缺陷:代码 不连续 TLB 被淘汰:2万次中有1次被淘汰;由于访问代码不连续代码:// 7_TLB_test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include "pch.h"#include<s...原创 2019-10-22 13:32:00 · 238 阅读 · 0 评论 -
15_TLB中的G属性
》 TLB 是为了增加访问内存的效率即 如果 是 29 9 12 分页 请求数据 可能需要访问 4次内存;为了解决这个问题;出现了 TLB (虚拟地址到物理地址的转换关系),如果目标地址在TLB缓存中,那么直接从TLB 取出 物理地址;》 这个实验做起来很麻烦,因为:TLB 是CPU 内部的,没法通过汇编指令访问TLB;调试器,也没有办法知道 TLB 中有哪些项只...原创 2019-10-22 13:30:00 · 383 阅读 · 0 评论 -
14_内存分配延迟
分配的虚拟内存没有使用之前 是不会映射物理内存的。1 申请区段 目的: 对齐4kb// 定义一个可读可写的区段#pragma section("data seg", read,write) // 在区段里面 定义一个变量 var =1 (这里是区段第一个变量,所以坑定是 4kb对齐的起始地址)declspec(allocate("data seg")) DWORD var = 1;...原创 2019-10-22 13:27:00 · 409 阅读 · 0 评论 -
13_平行进程
可以用来做进程保护!!! 平行得2个程序之间》通过cr3的切换,导致运行的代码是另外一个程序中的代码上面代码的缺陷:不能动态获取cr3,得程序二先运行打印出来不能很好平行的切换代码执行注意 这里实验的时候,需要多次调整地址;使得能平行过渡到另一个程序;可以使用Nop 这些填充来控制两者之间代码过度的位置照应。程序1:// 6_平行进程A.cpp : 此文件包含...原创 2019-10-22 13:23:00 · 298 阅读 · 0 评论 -
11_零地址读写
原理: 修改 进程空间 虚拟 零地址 的 pte 为 一个当前程序的全局变量;这样 零地址 指向的就是 同一个物理页且属性相同;修改 一个虚拟地址数据;另外的虚拟地址数据同样会改变。注意: 中间加阴影的部分 是为了刷新 TLB 快表,后面章节有详解。测试结果:这里不知道为什么printf时候 我的 exception handler 4 检测异常;导致输出不了;但是的确0页 映射到了 ...原创 2019-10-22 13:19:00 · 697 阅读 · 0 评论 -
10_PAE_非PAE
前置知识:在 windows 中 保护模式 有两种模式: 段保护 和 页保护段保护 主要体现在 段选择子上;但是数据段、代码段、栈段等采用的都是4GB平坦模式,段的特征并没有那样展现。所以具体的保护机制 采用的是页保护。PAE和 非PAE:页保护 有两种:非 PAEPAE开启 PAE: 在 boot.ini 中 设置:为 noexcute -- 即不可执行 ;...原创 2019-10-22 13:03:00 · 339 阅读 · 0 评论 -
9_山寨系统调用 SystemCallEntry
思想: 再次在 GDT 中偷内存 搭建 系统调用需要的 逻辑框架与功能实现;基本分解妄想:构建系统调用的代码:拷贝到 偷取的内存中:idt 向量 序号21位置: 8003ee00`0008f120 各函数的实现:注意: systemcallentry() 中esp + 0xc 是 3环 的 esp3环的 esp 应该是调用 函数的时候的发怒hi地址...原创 2019-10-22 13:00:00 · 199 阅读 · 0 评论 -
8_InlineHook
1 shellcode低2Gb警告、应使用高2GB 稳定 :在内核挂钩子:由于每个进程的低2gb 的数据是不同的;所以 在内核挂钩子 因该把 代码 放在 高 2gb。方法1(申请):比如 使用前面的 ExAllocatePool(0,size);分配非分页内存,然后把shellcode 拷贝到 非分页内存。方法2(偷内存):注意: 偷的时候 看一下 页属性 是否可读可写...原创 2019-10-22 11:43:00 · 222 阅读 · 0 评论 -
7_API调用
0 查看 kifastcallentry 里面具体怎么调用首先是 切换了 fs 为kpcr的选择子然后 构造了 一个trap frame(保存3环--》0环 切换的上下文;如果0环不使用就没啥用,就不用构造;例如这里实验就没有构造,只是 切换了内核的kpcr)1 使用内核api 申请内存 注意:1.1 这里的函数地址是写死的,真正的地址应该动态获取1.2 这里push ...原创 2019-10-22 11:43:00 · 147 阅读 · 0 评论 -
6_再次开中断STI的正确姿势
1 直接开启sti --蓝屏2 配置环境 正确开启sti 中断kpcr -- 很多重要线程切换的数据、结构进入内核的时候 fs 不再是teb/tib; 是kpcr。同时观察 kifastcallentry,发现 的确设置了 fs 为内核的 kpcr:那我们手动修改成 kpcr ;注意: 如果 直接使用fs 不行;那么就查相关硬编码 来代替。效果 系统不卡,且...原创 2019-10-22 11:41:00 · 458 阅读 · 0 评论 -
5_中断现场下
理论:int x; 中断处理 响应切换(es、ss、esp) 应该由 硬件支持;如果其中交由汇编程序;那么还是不安全的,还是可以认为i控制。同理 iretd返回 也需要硬件支持。中断 使用到了 tss 数据段中的 ss esp;cs 怎么来的:来自于 我们构造的中断门 中的段选择子 如 : 0040ee00~00081040 这里 段选择子就是 8. 所以 切换之后的...原创 2019-10-22 11:39:00 · 126 阅读 · 0 评论 -
4_中断现场中
虚拟机和模拟器区别:--windbg双机调试给虚拟机下断点是跟虚拟机子系统进行交互,可能windbg调试器会修改到内核环境:比如寄存器、gdt表等会被改变(有时候你调试发现windbg中gdt 的某项数据 和 pchunter 中gdt的某个数据不一致;其实,大概率pchunter才是正确的 );原因如前面一句话所述;-- 模拟器 (如 bochs)是实时的数据;下断点是模拟断...原创 2019-10-22 11:38:00 · 191 阅读 · 0 评论 -
3_中断现场上
1 查看中断前后 上下文的变换使用 代码打印 进入 中断前后的 上下文,发现有 cs ss esp 改变了。中断门只用到了 TSS数据段中 cs ss esp 这几个东西;任务门 任务切换用到了更多的上下文 TSS 数据段的所有数据 。TSS 数据格式:2 代码:// 3_中断现场分析.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#inc...原创 2019-10-22 11:35:00 · 167 阅读 · 0 评论 -
2_多核复杂性
前置知识为了防止中断嵌套会自动 cli 在中断能处理的时候会自动 cli -- 清除中断标记位 if。 这样如果在if = 0 的时候 ,0环死循环 那么就会造成系统假死崩溃。实际代码验证我们把前一次的代码设置成死循环void _declspec(naked) IdtEntry(){// 这里是裸函数,所以不会有函数头 push ebp,mov ebp,esp,,和 ret...原创 2019-10-22 11:34:00 · 225 阅读 · 0 评论 -
1_中断提权
1 使用pchunter查看系统中断表(中断描述符表)1.1 那些中断处理地址内核高2GB ,所以中断处理环境坑定在0环利用分析:那我们把自己得处理函数放在这里面,那经过这个表调用就能获得高权限;注意: 代码 应该把随机基址关闭,并且使用release版本,这样地址稳定一些,debug 即使不开随机基址,可能运行中 子函数的地址会因为重构(当你改变内容的时候,可能编译器判...原创 2019-10-22 11:31:00 · 251 阅读 · 0 评论 -
0_一些可供参考的字典知识
1 段描述符1.1 普通段描述符 s = 11.1.1数据段描述符1.1.2 代码段描述符1.2 系统段描述符 s = 0基本:详细:type 的常用类型:e :1.2.1 任务门、中断门、陷阱门 s = 01.2.2 TSS 格式注意: 中断 处理使用到了 这里面的 ss esp 任务 切换处理 使用到了全部1....原创 2019-10-22 11:26:00 · 124 阅读 · 0 评论 -
12_通过 CR3 切换_读取指定进程数据
注意:cr3 切换 ,导致eip 指向的页面,改变为对应cr3 的页面;所以代码也变了;这里需要将这部分代码放入公共区域。解决:使用 类似前面 山寨 systemfastcallentry 的方法;使用 int 20 将代码拷贝到 高2gb 公共区域。 注册到 int 21,然后中断调用即可。...原创 2019-10-22 13:22:00 · 1622 阅读 · 0 评论 -
18_ShadowWalker
白皮书中 page-fault error code:shadowWalker 原理:接管 指定程序 的 执行页面异常、读写页面异常;然后 调用一下正常的 使其出现在快表;然后恢复到假的pte------ 根据白皮书中 的error code 过滤出 执行、读写异常类型相关: 将 402000 这个页面通过修改pte 设置为不存在(直接 给 p位置为 0);这样产...原创 2019-10-22 13:36:00 · 241 阅读 · 0 评论