Linux系统调用劫持的检测方法
2015-12-08任幸东王剑
任幸东+++王剑
【 摘 要 】 系统调用劫持是一种隐蔽性强、危害较大的攻击技术。论文研究了Linux系统调用劫持的原理,在此基础上分析了检测系统调用劫持的方法,帮助Linux服务器的维护人员找到合适的方法检测攻击。
【 关键词 】 系统调用;Linux;入侵检测
1 引言
系统调用劫持是一种常见的rootkit实现技术。由于运行在内核态,因此其具有隐蔽性强,危害大的特点。对于开源操作系统Linux来说,系统调用劫持的方法更加多样。本文研究了Linux下常见的系统调用劫持方式,并以此为依据介绍检测系统调用劫持的一些方法,为系统的维护人员提出一些建议,避免攻击者利用系统调用劫持的方法造成危害。
2 SCT地址的寻找方法
在Linux系统下,系统调用需要由int 0x80中断实现,其中断服务程序为system_call。而int 0x80的入口地址存放在IDT(Interrupt Descriptor Table 中断描述符表)中。系统调用的指针存放在 SCT(System Call Table 系统调用表)中。因此,实现系统调用替换的关键是获取IDT的地址与SCT的地址。系统运行在32位的CPU中,具体实现过程分几步。
(1)获取IDT地址。IDT的信息主要存放在IDTR寄存器中,这个寄存器存放了IDT的线性地址与IDT的大小信息。可以使用SIDT操作获取IDTR中的数据。这里使用一个结构体idtr,有两个变量base与length,类型分别为unsigned int 与unsigned short。其中base存放了IDT的基址,length存放IDT的大小。使用SIDT这条指令实现将IDTR寄存器中的内容存入idtr中。
(2)获取int 0x80中断处理程序system_call的地址。获取IDT基址后,可以方便地获取每个中断描述符的地址。定义结构体指针idt,以及结构体中的两个变量hoffset与loffset分别表示中断程序地址的高16位与低16位。……