zoukankan      html  css  js  c++  java
  • 分析 INT 0x2E 和 sysenter如何进入R0

    分析 INT 0x2E 和 sysenter如何进入R0

    一、回顾

    上课我们学习到3环如何进入0环,分别是中断门,快速调用,如果CPU支持快速调用,
    那么_KUSER_SHARED_DATA 结构体的 SystemCall 属性指向的函数是 KiFastSystemCall;
    如果不支持,那么SystemCall 指向的函数是KiIntSystemCall。

    KiFastSystemCall(快速调用)
    KiIntSystemCall(中断门)

    二、分析 INT 0x2E

    KiIntSystemCall触发 INT 2E中断,我们可以用windbg查看2E号中断对应的描述符:83e8ee00`0008efee

    拆分中断门描述符:83e8ee00`0008efee
    CS=0008(系统代码段),EIP=83e8efee(KiSystemService函数地址)

    接下来看看tr寄存器的值,tr=0x28,然后看看TSS描述符:80008b1e`400020ab

    拆分TSS描述符:80008b1e`400020ab
    base=801e4000

    查看一下TSS地址
    kd> dd 801e4000
    801e4000 00000000 83f79cb0 00000010 00000000
    801e4010 00000000 00000000 00000000 00000000

    esp0=83f79cb0 ss=10

    三、分析 sysenter

    sysenter是从MSR寄存器读取 CS0、ESP0、EIP0的寄存器的值,SS0=IA32_SYSENTER_CS+8计算而来。

    查看 CS,ESP,EIP
    kd> rdmsr 174
    msr[174] = 0000000000000008 kd> rdmsr 175 msr[175] = 0000000080790000
    kd> rdmsr 176
    msr[176] = 00000000`83e8f0c0

    EIP是KiFastCallEntry函数:

    kd> u 83e8f0c0
    nt!KiFastCallEntry:
    83e8f0c0 b923000000 mov ecx,23h
    83e8f0c5 6a30 push 30h
    83e8f0c7 0fa1 pop fs
    83e8f0c9 8ed9 mov ds,cx
    83e8f0cb 8ec1 mov es,cx
    83e8f0cd 648b0d40000000 mov ecx,dword ptr fs:[40h]
    83e8f0d4 8b6104 mov esp,dword ptr [ecx+4]
    83e8f0d7 6a23 push 23h

    四、总结

    通过中断门进入0环:
    1.中断号(0x2E)固定的
    2.cs/eip门描述符提供
    3.进入R0后执行内核函数:nt!KiSystemService:

    通过sysenter(快速调用)进入0环:
    1.CS/ESP/EIP由MSR寄存器提供(SS是算出来的)
    2.进入R0后执行内核函数:nt!KiFastCallEntry:

    接下来的课程,我们讲逆向分析:KiSystemService与KiFastCallEntry

  • 相关阅读:
    Ubuntu查看端口占用情况
    在jupyter中添加新的环境
    C++指针
    C++排序:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序
    查找一:C++静态查找
    C++链式队列
    C++顺序循环队列
    C++链式栈
    C++顺序栈
    C++双向循环链表
  • 原文地址:https://www.cnblogs.com/Besttwuya/p/14125926.html
Copyright © 2011-2022 走看看