完成体系挪用的几种要领 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

完成体系挪用的几种要领

申博_新闻事件 申博 37次浏览 未收录 0个评论

本文,我们将议论在x86上完成用户到内核转换的许多要领,即体系挪用。让我们起首疾速回忆一下实际须要完成哪些体系挪用。

在当代操纵体系中,用户形式(实行一般运用顺序代码)和内核形式(能够打仗体系设置和装备)是有区分的。体系挪用是运用顺序从操纵体系内核要求效劳并弥合它们之间差别的一种要领。为了完成这一点,CPU须要为运用顺序供应一种机制,使其能够平安地从用户形式转换到内核形式。

所以在如许的运转环境中,安满是最主要的,意味着运用顺序不能跳转到恣意的内核代码。不然,这将许可运用顺序在体系上做它想做的任何事情,留下平安隐患。内核必需能够设置定义的进口点,而处置惩罚器的体系挪用机制必需强制实行这些进口点。在处置惩罚体系挪用以后,操纵体系还须要晓得运用顺序的返回位置,因而体系挪用机制也必需供应此信息。

所以,我提出了四种相符我以上形貌的运转机制,这些机制都适用于64位环境,假如你想相识在32位环境下的运转机制,请点此零丁相识。

1.顺序运用int指令中缀;

2. 挪用门;

3.运用sysenter/sysexit举行疾速体系挪用;

4.运用syscall/sysret举行疾速体系挪用;

顺序中缀是最陈旧的机制,其症结头脑是运用与硬件中缀雷同的要领进入内核。本质上,它依然是1982年在286上以庇护形式引入的机制,然则,即使是初期的cpu也已有了这个机制。

因为中缀向量0x80依然能够用于在64位Linux上举行体系挪用,所以我们将继承运用这个例子:

完成体系挪用的几种要领

处置惩罚器经由过程从int指令中猎取中缀向量号并在中缀形貌符表(IDT)中查找响应的形貌符来找到内核进口地点。这个形貌符将是中缀门(Interrupt gate)形貌符和圈套门(Trap gate)形貌符,它包括指向内核中处置惩罚函数的指针。

运用中缀门(Interrupt gate)形貌符和圈套门(Trap gate)形貌符的差别权限级别之间的这些范例的转换也会致使处置惩罚器切换客栈。内核权限级别的客栈指针保留在使命状况段(TSS)中,TSS 全称task state segment,是指在操纵体系历程治理的过程当中,使命(历程)切换时的使命现场信息。

切换到新的客栈以后,处置惩罚器将返回地点和用户的客栈指针推送到内核客栈上。然后,内核中的一个典范处置惩罚顺序例程将继承推送客栈上的通用寄存器,并保留它们。在此过程当中,在客栈上建立的数据结构称为中缀帧。

使用osquery进行远程取证

Osquery是一个SQL驱动操作系统检测和分析工具,它由Facebook创建,支持像SQL语句一样查询系统的各项指标,可以用于OSX和Linux操作系统。另外,osquery是一个多平台软件,可以安装在Linux,Windows,MacOS和FreeBSD上。它允许我们使用基于SQL的查询来处理操作系统的配置文件、性能和安全检查等。 另外,系统管理员使用osquery可以对端口进行远程控制和日常监控,安全管理员也可以使用它来寻找系统上潜藏的攻击指标。现在,取证人员也开始注意到osquery了。虽然osquery 的核心服务

要返回到用户空间,内核在恢复通用寄存器以后实行iret(中缀返回)指令。iret恢复用户的客栈,并在最初输入内核的int指令以后继承实行。只管这里的形貌很简短,但iret是x86指令集中最庞杂的指令之一。

如今,说说我的第二种机制,挪用门异常相似于顺序中缀机制。某种程度上,挪用门在某种程度上是完成体系挪用的正式要领,然则我晓得除了歹意顺序以外,挪用门没有其他用处。

我在这里强调了顺序中缀流和挪用门遍历之间的区分:

完成体系挪用的几种要领

用户经由过程实行远端挪用来启动体系挪用,而不是int。长途挪用来自x86分段内存模子的遗留部份,在这个模子中,挪用指令不仅指定要去的指令指针,而且还援用指令指针相对于运用选择器的内存段(在本例中是0x18)。

处置惩罚器在全局形貌符表中查找对应的段,在我们的例子中,找到的是挪用门而不是一般段。与中缀门一样,挪用门指定内核中的指令指针。在本例中,处置惩罚器会疏忽挪用指令供应的指令指针。其他的事情相似于顺序中缀的状况,不过,因为硬件建立了差别的客栈帧规划,内核必需运用差别的指令来返回途径。

正如你将在下面看到的,这两种内核进口要领都很慢。在对中缀门和挪用门遍用时,处置惩罚器会从GDT从新加载代码和客栈段寄存器。可想而知,每一个形貌符的负载是何等的大,因为处置惩罚器必需先解码相称杂沓的数据结构并实行许多搜检。

在当代操纵体系中,许多搜检都是毫无意义的。比方,分段内存模子供应的特征及其支撑的分层庇护域均不须要运用。每一个段都有一个零基数和最大大小,而不是不订交的内存段。经由过程分页完成庇护,庇护环仅用于完成内核和用户形式。庇护环是一种用来在发作毛病时庇护数据和功用(提拔容错度)和防止歹意操纵 (提拔计算机平安)的设想体式格局

这个题目的解决方案来自于Intel和AMD: sysenter/sysexit是在Intel上完成疾速体系挪用的指令对,他们在1997年推出了奔驰II。AMD在1998年推出了与K6-2相似但不兼容的指令对syscall/sysret。

这两个指令对的事情道理基础雷同,不须要查询内存中的形貌符表来决议做什么,大部份功用都是硬编码的,未运用的灵活性也会丧失:sysenter和syscall采纳平面内存模子,并加载具有固定值的段形貌符。别的,它们还与权限级别的任何非标准运用不兼容。

内核可接见的特定于模子的寄存器(MSR)指向内核的体系挪用进口点,现在sysenter还以这类体式格局切换到内核客栈。处置惩罚器不须要诠释内存中的数据结构,返回地点保留在通用寄存器中,以便内核保留到它想保留的任何位置。

我已测量了运用内核中的空体系挪用处置惩罚顺序进入和退出内核的体系斲丧,详细的microbenchark代码请点此下载。我们只斟酌硬件对体系挪用途径的体系斲丧。以下所示,机能差别惊人:

完成体系挪用的几种要领

运用syscall/sysret或sysenter/sysexit实行体系挪用比运用传统要领快许多,这两种当代要领每次从用户到内核往复的往复都要消费约莫70个周期,该周期是一个小于64位的整数除法!

本文翻译自:https://x86.lol/generic/2019/07/04/kernel-entry.html#fnref:supervisor


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明完成体系挪用的几种要领
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址