0 - 前言
1 - 绪论
2 - 介绍
2.1 - 什么是中断(interrupt)?
2.2 - 中断和异常(exception)
2.3 - 中断向量
2.4 - 什么是IDT?
3 - 异常
3.1 - 异常列表
3.2 - 当异常出现时会发生什么 ?
3.3 - 中断钩子(Hooking) by mammon
3.4 - 一般中断钩子
3.5 - profit钩子 : 我们第一个后门
3.6 - fun钩子
4 - 硬件中断
4.1 - 它是如何工作的 ?
4.2 - 初始化和半底(bottom half)激活过程
4.3 - 键盘中断钩子
5 - 为系统调用安排的异常
5.1 - 系统调用列表
5.2 - 系统调用是如何工作的 ?
5.3 - profit钩子
5.3.1 - sys_setuid钩子
5.3.2 - sys_write钩子
5.4 - fun钩子
6 - CheckIDT
7 - 参考 & 致谢
8 - 附录
前言:
看到这片文章就让我想到LSD在5th Argus Hacking Challenge上的精彩表演。
只不过当时玩的是系统LDT漏洞,现在玩的是系统IDT后门。翻译不妥的地方还请斧正,如果您
的英文比较好的话,还是看原文吧。
--[ 1 - 绪论
众所周知,Intel x86 CPU能够运行在两种模式下:一种是实模式,一种是保护模式。
实模式我们就不讨论了,现在所有的操作系统都使用的是保护模式来使内核和一般进程隔离。
保护模式提供4个不同的权限等级(ring0...ring3)。用户应用程序在ring3,系统内核运行
在ring0.这使内核获得了访问所有CPU寄存器和硬件内存的权力。
在文中,我们将演示如何在Linux/x86上修改IDT。再进一步,我们将演示如何使用
一些技术重定向系统调用(象LKM做到的那样)。
本文中的例子只来说明使用LKM把可执行代码装载到内核空间是件容易的事情。其他超出
本文讨论范围的技术也可以用来把可执行代码装载到内核空间或者用来隐藏内核模块(就象
Spacewalker的方法一样)。
CheckIDT是个有用的工具,它检查IDT并且每5分钟避免内核panic一次。
--[ 2 - 介绍
----[ 2.1 - 什么是中断(interrupt)?
"中断被定义为当一个事件发生时,改变处理器的指令序列。这样的事件可由CPU芯片
内部或者外部硬件产生电信号产生"
(摘自: "Understanding the Linux kernel," O'Reilly publishing.)
----[ 2.2 - 中断和异常(exception)
Intel参考手册上指出“同步中断”(在一个指令执行完成后,由CPU控制单元产生的)作为“异常”。
异步中断(可能会在任意时刻由其他硬件产生的)才称为“中断”。中断被外部的I/O设备产生。
但是异常是由编程错误或者是由反常情况(必须由内核来处理)触发的。在该文档中,
术语“中断信号”既指异常又指中断。
中断分为两种类型:可屏蔽中断--它在短时间片段里可被忽略;不可屏蔽中断--它必须被立即处理。
不可屏蔽中断是由紧急事件产生例如硬件失败。著名的IRQS(中断请求)失败划为可屏蔽中断。
异常被分为不同的两类:处理器产生的异常(Faults, Traps, Aborts)和编程安排的
异常(用汇编指令int or int3 触发)。后一种就是我们经常说到的软中断。
----[ 2.3 - 中断向量
每个中断或者异常用一个0-255的数字识别。Intel称这个数字为向量(vector).这些
数字如下分类:
- From 0 to 31 : 异常和不可屏蔽中断
- From 32 to 47 : 可屏蔽中断
- From 48 to 255 : 软中断
Linux只使用一个软中断(0x80)作为调用系统内核函数的系统调用接口。
硬件IRQs从IRQ0...IRQ15分别被关联到了中断向量32..47。
----[ 2.4 - 什么是IDT?
IDT = Interrupt Descriptor Table 中断描述表
IDT是一个有256个入口的线形表,每个中断向量关联了一个中断处理过程。
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 我们 unsigned 中断 long 函数 void 处理 struct if |
注册
个人空间
