前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Windows内核实验

Windows内核实验

作者头像
yichen
发布2020-02-14 16:44:29
9150
发布2020-02-14 16:44:29
举报

说明

教程是周壑老师在 B 站的 windows 内核实验系列视频,这只是笔记,不是教程,大家想要学习可以去 B 站找视频看

B 站空间链接:

https://space.bilibili.com/37877654

windows内核实验第一集:

https://www.bilibili.com/video/av35033387

实验环境配置

双机调试配置

1、虚拟机添加串口:

代码语言:javascript
复制
\\.\pipe\com_1

打开虚拟机的 C 盘下的 boot.ini,添加如下内容:

代码语言:javascript
复制
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional Debug" /noexecute=optin /fastdetect /debugport=COM1 /baudrate=115200

创建一个 windbg 的快捷方式,快捷方式目标中添加以下内容:

代码语言:javascript
复制
D:\anquan\CTF-tools\RE\windbg\windbg_cn_6.11.0001.404.exe -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,resets=0 -y SRV*D:\anquan\symbol*http://msdl.microsoft.com/download/symbols

上面的部分内容要根据自己的情况更改一下

这是 windbg 所在目录

代码语言:javascript
复制
D:\anquan\CTF-tools\RE\windbg\windbg_cn_6.11.0001.404.exe

这是符号路径,联网的时候会下载在这个路径里

代码语言:javascript
复制
D:\anquan\symbol

实验 1:中断提权

一些 windbg 命令

代码语言:javascript
复制
r eax

就是看一下 eax 的内容

代码语言:javascript
复制
dq 地址 L140

查看地址的内容,后面跟的一个 L 可以查看的长度,也就是 range

代码语言:javascript
复制
eq 8003f500 0040ee00`00081000

把 0040ee00`00081000 写到 8003f500 的地方

实验部分

使用命令

代码语言:javascript
复制
r idtr

查看中断描述表寄存器,找到中断表的位置

idt 是中断描述表,idtr 就是中断描述表寄存器,用来记录 idt 在什么地方

得到:idtr=8003f400

使用

代码语言:javascript
复制
dq 8003f400 -L40

查看中断描述表

会看到 80548e00`000831a0 等这些差不多的,其实真正的是两边的 8 个,805431a0,中间的是一些属性,后面再说

我们要做的就是:用程序写一个函数,他会去触发中断,一旦执行中断之后就可以执行异常,异常的处理地址是我们可以用 windbg 的 eq 命令写入的,触发异常之后就可以执行高权限的命令了

具体做法是构造一个裸函数,这个裸函数是我们用来执行高权限代码的地方,这个函数的入口就是 401000

使用

代码语言:javascript
复制
eq 8003f500 0040ee00`00081000

把 00401000 写到 8003f500 的地方

(这里注意应该是 ee00 而不是 8e00,否则用户态的进程是没法访问的,ee 与 e8 的区别是 ee 允许用户态来触发,而 e8 只允许内核态)

比如普通的 int 3 断点,直接在代码里面就可以执行,它的前半部分是 ee00,如果是 e800 的就不行

写一个函数,把函数的地址塞到向量表里面,使用裸函数

然而每次运行地址都是不一样的,在属性里面把随机地址关了填上一个固定地址

代码语言:javascript
复制
代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
DWORD g_temp=0;
void _declspec(naked) IdtEntry()//这是一个裸函数,它的入口是401000
{
    _asm{
        mov eax,dword ptr ds:[0x8003f014]
        mov g_temp,eax
        iretd
        }
}
void go()//用来触发异常的
{
    _asm int 0x20
/*这个地方,涉及到属性了,要是 int 3 的话,因为属性 ee00 是允许 ring 3 也就是用户访问的,所以会提示触发了一个断点,如果是 int 0 的话就属于你是用户态却想访问内核态的东西 8e00,会报错,当正常出现这个异常的时候是由硬件访问这个地址的 */
}
void main()
{
    if((DWORD)IdtEntry != 0x401000)
    {
    printf("%p\n",IdtEntry);
    exit(-1);
    }
    go();
    printf("%p\n",g_temp);
    system("pause");
}

tips:

如果在 XP 上显示不是有效的 win32 => 右键项目 => 属性 => 配置属性 => 常规 => 平台工具集 => 选择 XP 的

主要是通过控制了一个异常,来执行高权限的命令,但我这个菜鸡也玩不出什么花样来

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陈冠男的游戏人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档