内核实验02 中断提权 中断现场之寄存器探测

本帖最后由 BeneficialWeb 于 2019-9-1 19:23 编辑

工具:VMMWare vs2017, WinDbgPrew,PCHunter64
平台:win7x64虚拟机
声明:本次实验是基于周壑大佬的视频自学而成。

实验目的主要是观察ring3进ring0的权限变化,观察寄存器的变化
实验步骤:
1.通过双机调试构造int 20号中断处理例程
2.编写代码读取两个环境下的寄存器
3.观察实验结果
[Asm] 纯文本查看 复制代码

.data
EXTERN        g_rbp:DQ
EXTERN        g_rax:DQ
EXTERN        g_rcx:DQ
EXTERN        g_rbx:DQ
EXTERN        g_rdx:DQ
EXTERN        g_rsi:DQ
EXTERN        g_rdi:DQ
EXTERN        g_rsp:DQ
EXTERN        g_cs:DW
EXTERN        g_fs:DW
EXTERN        g_ds:DW
EXTERN        g_ss:DW
EXTERN        g_gs:DW
EXTERN        g_es:DW

.code
IdtEntry PROC
        mov [g_rax+8],rax
        mov [g_rbx+8],rbx
        mov [g_rcx+8],rcx
        mov [g_rbp+8],rbp
        mov [g_rsi+8],rsi
        mov [g_rdi+8],rdi
        mov [g_rsp+8],rsp
        mov [g_rdx+8],rdx

        mov word ptr [g_cs+2],cs
        mov word ptr [g_ds+2],ds
        mov word ptr [g_ss+2],ss
        mov word ptr [g_fs+2],fs
        mov word ptr [g_es+2],es
        mov word ptr [g_gs+2],gs
        iretq
IdtEntry ENDP


go PROC
        mov [g_rax],rax
        mov [g_rbx],rbx
        mov [g_rcx],rcx
        mov [g_rbp],rbp
        mov [g_rsi],rsi
        mov [g_rdi],rdi
        mov [g_rsp],rsp
        mov [g_rdx],rdx

        mov word ptr [g_cs],cs
        mov word ptr [g_ds],ds
        mov word ptr [g_ss],ss
        mov word ptr [g_fs],fs
        mov word ptr [g_es],es
        mov word ptr [g_gs],gs
        int 20h
        ret
go ENDP
END

[C] 纯文本查看 复制代码

#include<stdlib.h>
#include<stdio.h>
#include<Windows.h>

extern VOID IdtEntry();
extern VOID go();

DWORD64 g_rax[2], g_rbx[2], g_rcx[2], g_rdx[2], g_rbp[2],g_rsi[2],g_rdi[2],g_rsp[2];
WORD g_cs[2], g_ds[2], g_ss[2], g_es[2], g_fs[2], g_gs[2];


void main()
{
        // r idtr
        // dp fffff80000b95080 l42
        // ep fffff800`054e9280 4000ee00`00101200 00000000`00000001
        if (IdtEntry != 0x140001210)
        {
                printf("error address:%p\n", IdtEntry);
                exit(-1);
        }
        go();
        printf("rax:%p\r\nrbx:%p\r\nrcx:%p\r\nrdx:%p\r\nrbp:%p\r\nrsp:%p\r\nrsi:%p\r\nrdi:%p\r\n", g_rax[0], g_rbx[0], g_rcx[0], g_rdx[0], g_rbp[0],g_rsp[0],g_rsi[0],g_rdi[0]);
        printf("cs:%04x\r\nds:%04x\r\nss:%04x\r\nes:%04x\r\nfs:%04x\r\ngs:%04x\r\n", g_cs[0], g_ds[0], g_ss[0], g_es[0], g_fs[0], g_gs[0]);
        printf("\n");
        printf("rax:%p\r\nrbx:%p\r\nrcx:%p\r\nrdx:%p\r\nrbp:%p\r\nrsp:%p\r\nrsi:%p\r\nrdi:%p\r\n", g_rax[1], g_rbx[1], g_rcx[1], g_rdx[1], g_rbp[1],g_rsp[1], g_rsi[1], g_rdi[1]);
        printf("cs:%04x\r\nds:%04x\r\nss:%04x\r\nes:%04x\r\nfs:%04x\r\ngs:%04x\r\n", g_cs[1], g_ds[1], g_ss[1], g_es[1], g_fs[1], g_gs[1]);
        system("pause");
}

实验结果:

结果分析验证:

应该是没问题了。
总结:
在实验中学习保护模式,就不那么枯燥无聊了。




THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
  • 管埋员

    昵称

  • 取消
    昵称