摘要: 白皮书中 page-fault error code:shadowWalker 原理:接管 指定程序 的 执行页面异常、读写页面异常;然后 调用一下正常的 使其出现在快表;然后恢复到假的pte------ 根据白皮书中 的error code 过滤出 执行、读写异常类型相关:将 402000 这个页面通过修改pte 设置为不存在(直接 给 p位置为 0);这样产生异常 我们接管然后通过 0x10... 阅读全文
posted @ 2019-10-22 13:36 leibso二狗 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 页面异常捕获过滤: 原理:在 IDT 表中的e 号 处理 是 页面异常处理; 如果 我们 hook 掉 这个回调函数;那么就能获得全部的页面异常;再通过 cr3 对比 捕获指定的 cr3 (进程)的信息;最后再共享的区域将数据输出;然后测试程序获取该自己的页面异常信息;实验中 容易出现的错误:在 c 的时候注意将使用的寄存器(这里是eax)先保存起来;注意 通过栈保存 eax的话注意 相关进入... 阅读全文
posted @ 2019-10-22 13:33 leibso二狗 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 1 前面做的实验起始有缺陷访问内存之后,后面执行两句代码后;并不能保证刚才访问的代码还在TLB中;有可能被刷新出去了;实验验证缺陷:代码 不连续 TLB 被淘汰:2万次中有1次被淘汰;由于访问代码不连续代码:// 7_TLB_test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//​#include "pch.h"#include#include#include​#d... 阅读全文
posted @ 2019-10-22 13:32 leibso二狗 阅读(234) 评论(0) 推荐(0) 编辑
摘要: 》 TLB 是为了增加访问内存的效率即 如果 是 29 9 12 分页 请求数据 可能需要访问 4次内存;为了解决这个问题;出现了 TLB (虚拟地址到物理地址的转换关系),如果目标地址在TLB缓存中,那么直接从TLB 取出 物理地址;》 这个实验做起来很麻烦,因为:TLB 是CPU 内部的,没法通过汇编指令访问TLB;调试器,也没有办法知道 TLB 中有哪些项只有通过实验现象 结果,来证明其存在... 阅读全文
posted @ 2019-10-22 13:30 leibso二狗 阅读(273) 评论(0) 推荐(0) 编辑
摘要: 分配的虚拟内存没有使用之前 是不会映射物理内存的。1 申请区段 目的: 对齐4kb// 定义一个可读可写的区段#pragma section("data seg", read,write) // 在区段里面 定义一个变量 var =1 (这里是区段第一个变量,所以坑定是 4kb对齐的起始地址)declspec(allocate("data seg")) DWORD var = 1;​还可以这样申请... 阅读全文
posted @ 2019-10-22 13:27 leibso二狗 阅读(354) 评论(0) 推荐(0) 编辑
摘要: 可以用来做进程保护!!! 平行得2个程序之间》通过cr3的切换,导致运行的代码是另外一个程序中的代码上面代码的缺陷:不能动态获取cr3,得程序二先运行打印出来不能很好平行的切换代码执行注意 这里实验的时候,需要多次调整地址;使得能平行过渡到另一个程序;可以使用Nop 这些填充来控制两者之间代码过度的位置照应。程序1:// 6_平行进程A.cpp : 此文件包含 "main" 函数。程序执行将在此处... 阅读全文
posted @ 2019-10-22 13:23 leibso二狗 阅读(279) 评论(0) 推荐(0) 编辑
摘要: 注意:cr3 切换 ,导致eip 指向的页面,改变为对应cr3 的页面;所以代码也变了;这里需要将这部分代码放入公共区域。解决:使用 类似前面 山寨 systemfastcallentry 的方法;使用 int 20 将代码拷贝到 高2gb 公共区域。 注册到 int 21,然后中断调用即可。 阅读全文
posted @ 2019-10-22 13:22 leibso二狗 阅读(545) 评论(0) 推荐(0) 编辑
摘要: 原理: 修改 进程空间 虚拟 零地址 的 pte 为 一个当前程序的全局变量;这样 零地址 指向的就是 同一个物理页且属性相同;修改 一个虚拟地址数据;另外的虚拟地址数据同样会改变。注意: 中间加阴影的部分 是为了刷新 TLB 快表,后面章节有详解。测试结果:这里不知道为什么printf时候 我的 exception handler 4 检测异常;导致输出不了;但是的确0页 映射到了 和全局变量... 阅读全文
posted @ 2019-10-22 13:19 leibso二狗 阅读(321) 评论(0) 推荐(0) 编辑
摘要: 前置知识:在 windows 中 保护模式 有两种模式: 段保护 和 页保护段保护 主要体现在 段选择子上;但是数据段、代码段、栈段等采用的都是4GB平坦模式,段的特征并没有那样展现。所以具体的保护机制 采用的是页保护。PAE和 非PAE:页保护 有两种:非 PAEPAE开启 PAE: 在 boot.ini 中 设置:为 noexcute -- 即不可执行 ;激活 DEP 的功能 -在这个时候 ... 阅读全文
posted @ 2019-10-22 13:03 leibso二狗 阅读(300) 评论(0) 推荐(0) 编辑
摘要: 思想: 再次在 GDT 中偷内存 搭建 系统调用需要的 逻辑框架与功能实现;基本分解妄想:构建系统调用的代码:拷贝到 偷取的内存中:idt 向量 序号21位置: 8003ee00`0008f120 各函数的实现:注意: systemcallentry() 中esp + 0xc 是 3环 的 esp3环的 esp 应该是调用 函数的时候的发怒hi地址;所以实际的参数 是 + 4 偏移的位置。... 阅读全文
posted @ 2019-10-22 13:00 leibso二狗 阅读(178) 评论(0) 推荐(0) 编辑
摘要: 0 查看 kifastcallentry 里面具体怎么调用首先是 切换了 fs 为kpcr的选择子然后 构造了 一个trap frame(保存3环--》0环 切换的上下文;如果0环不使用就没啥用,就不用构造;例如这里实验就没有构造,只是 切换了内核的kpcr)1 使用内核api 申请内存 注意:1.1 这里的函数地址是写死的,真正的地址应该动态获取1.2 这里push 0x3b ; pop fs ... 阅读全文
posted @ 2019-10-22 11:43 leibso二狗 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 1 shellcode低2Gb警告、应使用高2GB 稳定 :在内核挂钩子:由于每个进程的低2gb 的数据是不同的;所以 在内核挂钩子 因该把 代码 放在 高 2gb。方法1(申请):比如 使用前面的 ExAllocatePool(0,size);分配非分页内存,然后把shellcode 拷贝到 非分页内存。方法2(偷内存):注意: 偷的时候 看一下 页属性 是否可读可写可执行在内核固定 没有使用... 阅读全文
posted @ 2019-10-22 11:43 leibso二狗 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 1 直接开启sti --蓝屏2 配置环境 正确开启sti 中断kpcr -- 很多重要线程切换的数据、结构进入内核的时候 fs 不再是teb/tib; 是kpcr。同时观察 kifastcallentry,发现 的确设置了 fs 为内核的 kpcr:那我们手动修改成 kpcr ;注意: 如果 直接使用fs 不行;那么就查相关硬编码 来代替。效果 系统不卡,且任何方式杀不掉,关机也杀不掉: 当前... 阅读全文
posted @ 2019-10-22 11:41 leibso二狗 阅读(250) 评论(0) 推荐(0) 编辑
摘要: 理论:int x; 中断处理 响应切换(es、ss、esp) 应该由 硬件支持;如果其中交由汇编程序;那么还是不安全的,还是可以认为i控制。同理 iretd返回 也需要硬件支持。中断 使用到了 tss 数据段中的 ss esp;cs 怎么来的:来自于 我们构造的中断门 中的段选择子 如 : 0040ee00~00081040 这里 段选择子就是 8. 所以 切换之后的cs 就是8ss\esp ... 阅读全文
posted @ 2019-10-22 11:39 leibso二狗 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 虚拟机和模拟器区别:-- windbg双机调试给虚拟机下断点是跟虚拟机子系统进行交互,可能windbg调试器会修改到内核环境:比如寄存器、gdt表等会被改变(有时候你调试发现windbg中gdt 的某项数据 和 pchunter 中gdt的某个数据不一致;其实,大概率pchunter才是正确的 );原因如前面一句话所述;-- 模拟器 (如 bochs)是实时的数据;下断点是模拟断点(用内存模拟的)... 阅读全文
posted @ 2019-10-22 11:38 leibso二狗 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 1 查看中断前后 上下文的变换使用 代码打印 进入 中断前后的 上下文,发现有 cs ss esp 改变了。中断门只用到了 TSS数据段中 cs ss esp 这几个东西;任务门 任务切换用到了更多的上下文 TSS 数据段的所有数据 。TSS 数据格式:2 代码:// 3_中断现场分析.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//​#include "pch.h"... 阅读全文
posted @ 2019-10-22 11:35 leibso二狗 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 前置知识为了防止中断嵌套会自动 cli 在中断能处理的时候会自动 cli -- 清除中断标记位 if。 这样如果在if = 0 的时候 ,0环死循环 那么就会造成系统假死崩溃。实际代码验证我们把前一次的代码设置成死循环void _declspec(naked) IdtEntry(){// 这里是裸函数,所以不会有函数头 push ebp,mov ebp,esp,,和 ret x / sub es... 阅读全文
posted @ 2019-10-22 11:34 leibso二狗 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 1 使用pchunter查看系统中断表(中断描述符表)1.1 那些中断处理地址内核高2GB ,所以中断处理环境坑定在0环利用分析:那我们把自己得处理函数放在这里面,那经过这个表调用就能获得高权限;注意: 代码 应该把随机基址关闭,并且使用release版本,这样地址稳定一些,debug 即使不开随机基址,可能运行中 子函数的地址会因为重构(当你改变内容的时候,可能编译器判断换个地址更优)而改变。注... 阅读全文
posted @ 2019-10-22 11:31 leibso二狗 阅读(267) 评论(0) 推荐(0) 编辑
摘要: 0 开发工具 VS20171 先从win xp 开始2 最好是纯净的 win xp 这样遇到的坑少顺利更贴合我们学习目的3 搭建双机环境:使用串口--在虚拟机定义全局管道符号链接形如:在虚拟机的启动选项里面添加上:; 。。 具体百度 记不到-b -- 连接的时候将虚拟机子系统段下来-k -- kernel内核调试com:pipe,port 指定连接串口-resets -- 调试子系统是否需要重... 阅读全文
posted @ 2019-10-22 11:28 leibso二狗 阅读(147) 评论(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.2.3 tr 寄存器str ax --- 3环栈 和 0 环栈为什... 阅读全文
posted @ 2019-10-22 11:26 leibso二狗 阅读(156) 评论(0) 推荐(0) 编辑