【发布时间】:2020-09-16 02:57:52
【问题描述】:
我在阅读 OSTEP 时有一个问题。问题是陷阱如何知道在操作系统中运行哪些代码?我知道这是一个糟糕的主意,因为这意味着用户可以在内核中做任何事情。但是我不清楚“想象一下跳入代码以访问文件,但只是在权限检查之后”一书中给出的示例,有人可以解释一下吗?还有如果一个程序可以直接发出系统调用而不使用陷阱表会发生什么?谢谢!
【问题讨论】:
我在阅读 OSTEP 时有一个问题。问题是陷阱如何知道在操作系统中运行哪些代码?我知道这是一个糟糕的主意,因为这意味着用户可以在内核中做任何事情。但是我不清楚“想象一下跳入代码以访问文件,但只是在权限检查之后”一书中给出的示例,有人可以解释一下吗?还有如果一个程序可以直接发出系统调用而不使用陷阱表会发生什么?谢谢!
【问题讨论】:
陷阱表通常由系统调用处理程序用来调用所请求的操作服务例程。它是一个受内核保护的表,因此不能在任意地址执行。而是映射一个请求的服务(通常是一个小数字,在 /usr/include 中搜索 syscall.h)到一个提供该服务的函数。
应用程序执行一些操作,例如:
_open:
mov $_SYS_OPEN, %r0
syscall
jmp-on-carry seterrno
ret
在系统调用运算符上调用的内核中的代码位执行如下操作:
int n;
if ((n = Proc->reg[0]) < 0 || n >= _N_SYSCALLS) {
return seterror(Proc, ENOSYS);
} else {
return (*sys_call_table[n])(Proc);
}
细节因您使用的操作系统而异,但总体思路是相同的,并且自 1970 年代以来一直保持相对稳定。
【讨论】: