如果我要编写汇编语言程序,我是否可以打破操作系统的安全机制 - 访问其他进程的地址空间,访问内核地址空间等?
修改:
如果我编写一个由OS提供的加载程序加载到内存中的汇编语言程序,操作系统在尝试访问受保护的内存地址空间时如何拦截我的程序?我的假设是这种保护内置于操作系统提供的系统调用和库中,如果您不使用这些系统调用和库,则允许您破坏操作系统策略。
答案 0 :(得分:5)
对于大多数架构(包括x86),保护内置于硬件中。
对于x86,有两种技术可以保护内核的地址空间和其他程序:分段和分页。大多数现代操作系统(包括Windows,OS X,Linux,BSD等)都使用分页作为主要技术,因此我将讨论它。
分页涉及页面目录和页表,它们描述了每个虚拟页面的属性:物理地址,权限等。页面目录和页面表映射到内核空间,因此无法由用户进程编辑
当内核切换到用户进程时,它会恢复用户进程的页面结构,因此它只有权访问自己的映射页面。当它尝试访问某些未映射的地址时,将引发页面错误。如果该地址处的存储器内容已被交换掉,则它们将被取消,并且该过程将继续而不会注意到任何事情(除了可能的小延迟)。如果该内存地址没有被分配,因此不会被交换掉,程序就会终止。
注意:只有汇编语言才会导致不安全行为,这也不正确。尝试写入C中的随机地址,您将看到它很可能立即崩溃。为什么?因为操作系统会通过页面错误检测地址空间违规。如果它没有崩溃,那就意味着你将写入属于自己地址空间的某些内存。
答案 1 :(得分:4)
如果您的程序作为操作系统控制的进程运行,则在计算机上运行,该计算机在硬件中提供足够的进程隔离(通常是地址空间管理保护)。 (好吧,你可以编写试图破坏安全性的指令,但是在设计良好的操作系统中,只要执行这些硬件,他们所做的就是陷阱)。
如果您运行的硬件没有此类保护功能,那么您按照惯例以协作方式运行在与操作系统和其他应用程序共享的空间中。这意味着你可以触摸并损坏操作系统和其他应用程序,但你不应该。您是否选择违反承诺取决于您;通常情况下,它不会使您成为该类硬件用户社区的朋友。
答案 2 :(得分:3)
保护内置于硬件中。根据页表检查每个加载/存储(和代码获取)(使用TLB缓存页表条目)。
此外,如果由用户空间进程运行,x86' LIDT等特权指令也会出错。 (该手册条目的例外部分表示它引发#GP(0)"如果当前权限级别不是0")。
如果在机器上获取root权限只需要手写一点,那么安全的多用户操作系统将无法实现。由于它们存在并且实际上很常见,我们知道你的前提必定是错误的。 (Linux,Unix,OS X,Windows都是以这种方式设计的。它们都有实施错误,允许攻击者运行任意内核代码,但这不是重点。)
答案 3 :(得分:1)
注意:此答案是Ira Baxter,glauxosdever和Peter Cordes提供的答案的合并,以及Cody Gray提供的评论< / p>
如果您的程序作为操作系统控制的进程运行,则不会在硬件上提供足够的进程隔离(通常是地址空间管理保护)的计算机上运行。
对于大多数架构(包括x86),保护内置于硬件中。
大多数现代操作系统(包括Windows,OS X,Linux,BSD等)都使用分页进行内存管理。分页涉及页面目录和页面表,它们描述了每个虚拟页面的属性:物理地址,权限等。
页面目录和页面表映射到内核空间中,因此无法由用户进程进行编辑。
针对页面表检查每个加载/存储(和代码获取)(使用TLB缓存页表条目)。
此外,如果由用户空间进程运行,x86&#39; LIDT等特权指令也会出错。 (该手册条目的例外部分表示它引发#GP(0)&#34;如果当前权限级别不是0&#34;)。