int 2e进内核

原创 2005年04月05日 22:25:00

一直很奇怪为啥ntdll里的 int 2e是咋进入内核的,不是说中断在ring 3下都不能用的吗? 可这样ntdll不也不中了? 回头用个程序一试 int 0x2e 果然没事,没出错,,int 0x20 就会出错,但出错的具体过是cpu的事,用sice也只是显示错在那一条,后来在书上找到了(linux的书 ...)
Makes sure the interrupt was issued by an authorized source. First, it compares the Current Privilege Level (CPL), which is stored in the two least significant bits of the cs register, with the Descriptor Privilege Level (DPL) of the Segment Descriptor included in the GDT. Raises a "General protection" exception if the CPL is lower than the DPL because the interrupt handler cannot have a lower privilege than the program that caused the interrupt. For programmed exceptions, it makes a further security check. It compares the CPL with the DPL of the gate descriptor included in the IDT and raises a "General protection" exception if the DPL is lower than the CPL. This last check makes it possible to prevent access by user applications to specific trap or interrupt gates.
原来这段话总是理解不好,现在才有点明白,现在的windows程序,ring 3下的用的全都是cs 001B,ds,es 0023 的描述符,而内核的cs是0008,所以在int 0x2e的时候,CPL = 3 > DPL = 0,固定是不行,然后就再检查门描述符的DPL,2e的描述符的DPL = 3,所以int 0x2e可以执行了,,看看具体的可能会好一点
kd> !pcr
PCR Processor 0 @ffdff000
        NtTib.ExceptionList: b96aac68
            NtTib.StackBase: b96aadf0
           NtTib.StackLimit: b96a8000
         NtTib.SubSystemTib: 00000000
              NtTib.Version: 00000000
          NtTib.UserPointer: 00000000
              NtTib.SelfTib: 7ffde000

                    SelfPcr: ffdff000
                       Prcb: ffdff120
                       Irql: 00000000
                        IRR: 00000000
                        IDR: ffff24e0
              InterruptMode: 00000000
                        IDT: 80036400
                        GDT: 80036000
                        TSS: 8028c000

              CurrentThread: fe8ec820
                 NextThread: 00000000
                 IdleThread: 8046c8c0

                  DpcQueue:
得到IDT地址80036400
2e的位置 80036400 + 2e*8 = 80036570

kd> dd 80036570
80036570  00083ea0 8046ee00 00086e40 80468e00
80036580  00088128 80068e00 0008a3e4 817c8e00
80036590  000834f4 80468e00 0008b844 817c8e00
800365a0  0008bdc4 817c8e00 00083512 80468e00
800365b0  0008351c 80468e00 00083526 80468e00
800365c0  00082db0 80068e00 0008e044 81888e00
800365d0  00083544 80468e00 0008da04 817c8e00

果然 segment:0008  offset 80463eA0  DPL 111 = 3

kd> ln 80463eA0
(80463ea0)   nt!KiSystemService   |  (80463f75)   nt!KiServiceExit
Exact matches:
    nt!KiSystemService = <no type information>

idt在系统中的位置是不变的,至少我重起以后还是一样,,idt的位置存在idtr寄存器中

 


As mentioned in the earlier section Section 4.2.3, Intel provides three types of interrupt descriptors: Task, Interrupt, and Trap Gate Descriptors. Task Gate Descriptors are irrelevant to Linux, but its Interrupt Descriptor Table contains several Interrupt and Trap Gate Descriptors. Linux classifies them as follows, using a slightly different breakdown and terminology from Intel:

Interrupt gate
An Intel interrupt gate that cannot be accessed by a User Mode process (the gate's DPL field is equal to 0). All Linux interrupt handlers are activated by means of interrupt gates, and all are restricted to Kernel Mode.

System gate
An Intel trap gate that can be accessed by a User Mode process (the gate's DPL field is equal to 3). The four Linux exception handlers associated with the vectors 3, 4, 5, and 128 are activated by means of system gates, so the four assembly language instructions int3, into, bound, and int $0x80 can be issued in User Mode.

Trap gate
An Intel trap gate that cannot be accessed by a User Mode process (the gate's DPL field is equal to 0). Most Linux exception handlers are activated by means of trap gates.

NT操作系统的Rootkit技术初探

1 NT操作系统的Rootkit技术初探   ...
  • goooooooooo
  • goooooooooo
  • 2006年09月23日 18:31
  • 490

windows系统调用int 2e处理过程

在X86体系架构中,中断处理向量由一个中断描述符表保存。中断描述符表的每个描述符项包括一个中断处理函数的地址、一个32位的描述符属性和中断之后中断所在代码的特权级别。下面是一个描述符项的宏定义,每个处...
  • dayenglish
  • dayenglish
  • 2014年08月01日 17:00
  • 1170

用INT 2E中断 关机VC代码

  • 2009年01月20日 14:58
  • 505B
  • 下载

调试器攻击技术 - ThreadHideFromDebugger

3、 ThreadHideFromDebugger 这项技术用到了常常被用来设置线程优先级的API ntdll!NtSetInformationThread(),不过这个API也能够用来防止调试...
  • ReversalC
  • ReversalC
  • 2015年03月19日 22:31
  • 1387

roothit 对于hook,从ring3有很多,ring3到ring0也有很多,根据api调用环节递进的顺序,在每一个环节都有hook的机会,可以有int 2e或者sysenter hook,ssdt hook,inline hook ,irp hook,object hook,idt hook等等。在这里,我们逐个介绍。

  • 2008年11月11日 16:15
  • 1.58MB
  • 下载

关于Int 2E

下面是反汇编ntdll.dll的NtCreateEvent部分 NtCreateEvent调用了int 2EExported fn(): NtCreateEvent - Ord:005AhExport...
  • lsaturn
  • lsaturn
  • 2006年07月14日 16:36
  • 2218

使用 int2e 关机(感觉很牛逼,分享一下)

原文地址:http://download.csdn.net/download/bing1564/980029 #include"windows.h" extern "C" __de...
  • nishuodeqianshou
  • nishuodeqianshou
  • 2013年10月18日 12:11
  • 1153

WEB漏洞测试payload整理

常用web漏洞测试的payload整理,把写的一个类sqlmap的web安全漏洞测试工具的Payload整理下来,供大家测试时参考。 [反射型xss] [在html形成] "'>document.ti...
  • nextdoor6
  • nextdoor6
  • 2016年12月14日 17:51
  • 1612

如何将驱动或模块编译进内核

如何将驱动或模块编译进内核 我们知道若要给linux内核添加模块(驱动)有如下两种方式: (1)动态方式:采用insmod命令来给运行中的linux加载模块。 (2)静态方式:修改linux的配...
  • MARZ07101
  • MARZ07101
  • 2012年06月09日 07:39
  • 4748

① 根文件系统直接编译进内核

直接用TQ2440提供的源码linux2.6.30.4, 然后用其提供的busybox.1.16.0 在(make menuconfig中)没有选中Initial Ram... 时是这样的 看...
  • sy373466062
  • sy373466062
  • 2011年11月21日 10:57
  • 3035
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:int 2e进内核
举报原因:
原因补充:

(最多只允许输入30个字)