0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

你对CPU这些隐藏指令怎么看?

Linux爱好者 来源:Linux爱好者 作者:Linux爱好者 2022-05-16 15:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

我们知道,我们平时编程写的高级语言,是经过编译器编译以后,变成了CPU可以执行的机器指令:5a0e623c-d4cc-11ec-bce3-dac502259ad0.png而CPU能支持的指令,都在它的指令集里面了。很久以来,我都在思考一个问题:CPU有没有未公开的指令?或者说:CPU有没有隐藏的指令?为什么会有这个问题?平常我们谈论网络安全问题的时候,大多数时候都是在软件层面。谈应用程序的漏洞、后端服务的漏洞、第三方开源组件的漏洞乃至操作系统的漏洞。但很少有机会去触及硬件,前几年爆发的熔断幽灵系列漏洞,就告诉我们,CPU也不是可信任的。要是CPU隐藏有某些不为人知的指令,这是一件非常可怕的事情。如果某一天,某些国家或者某些团体组织出于某种需要,利用这些隐藏的指令来发动攻击,后果不堪设想。虽然想到过这个问题,但我一直没有付诸实践去认真的研究。直到前段时间,有一位老师分享了一份PDF给我,解答了我的疑惑。这份PDF内容是2017年顶级黑客大会Black Hat上的一篇报告:《us-17-Domas-Breaking-The-x86-ISA》,作者是大神:@xoreaxeaxeax,熟悉汇编的同学知道这名字是什么意思吗?5a9e36be-d4cc-11ec-bce3-dac502259ad0.png这份PDF深度研究了x86架构CPU中隐藏的指令,原报告因为是英文,看起来有些晦涩,这篇文章,我尝试用大家易懂的语言来给大家分享一下这篇非常有意思的干货。有些人会问:真的会有隐藏指令的存在吗,CPU的指令集不是都写在指令手册里了吗?我们以单字节指令为例,单字节的范围是0x00-0XFF,总共256种组合,Intel的指令手册中是这样介绍单字节指令的:5ad4e8ee-d4cc-11ec-bce3-dac502259ad0.png横向为单字节的高四位,纵向为单字节的低四位,顺着表格定位,可以找到每一个单字节指令的定义。比如我们常见的nop指令的机器码是0x90,就是行为9,列为0的那一格。但是不知道你发现没有,这张表格中还有些单元格是空的,比如0xF1,那CPU拿到一个为0xF1的指令,会怎么执行呢?指令手册没告诉你。这篇报告的主要内容就是告诉你,如何去寻找这些隐藏的指令。

指令集的搜索空间

想要找到隐藏的指令,得先明确一个问题:一条指令到底有多长,换句话说,有几个字节,我们应该在什么样的一个范围内去寻找隐藏指令。如果指令长度是固定的,比如JVM那样的虚拟机,那问题好办,直接遍历就行了。但问题难就难在,x86架构CPU的指令集属于复杂指令集CISC,它的指令不是固定长度的。有单字节指令,比如:
90 nopCC int 3C3 ret
也有双字节指令,比如:
8B C8 mov ecx,eax6A 20 push 20h
还有三四节、四字节、五字节···最长能有十几个字节,比如这条指令:
指令:lock add qword cs:[eax + 4 * eax + 07e06df23h], 0efcdab89h机器码:2e 67 f0 48 818480 23df067e 89abcdef
一个字节、两个字节,甚至三个四个遍历都还能接受,4个字节最多也就42亿多种组合,对于计算机来说,也还能接受。但越往后,容量是呈指数型增长,这种情况再去遍历,显然是不现实的。

指令搜索算法

这份报告中提出了一种深度优先的搜索算法:5b0d9d60-d4cc-11ec-bce3-dac502259ad0.png该算法的指导思想在于:快速跳过指令中无关紧要的字节5b20ce3a-d4cc-11ec-bce3-dac502259ad0.png怎么理解这句话?比如压栈的指令push,下面几条虽然字节序列不同,但变化的只是数据,其实都是压栈指令,对于这类指令,就没必要花费时间去遍历:
  • 68 6F 72 6C 64 push 646C726Fh
  • 68 6F 2C 20 77 push 77202C6Fh
  • 68 68 65 6C 6C push 6C6C6568h
第一个字节68就是关键字节,后面的四个字节都是压入栈中的数据,就属于无关紧要的字节。如果能识别出这类,快速跳过,将能够大面积减少需要遍历的搜索空间。上面只是一个例子,如何能够系统化的过滤掉这类指令呢?报告中提出了一个方案:5b4bd922-d4cc-11ec-bce3-dac502259ad0.png观察指令中的有意义的字节,它们对指令的长度和异常表现会产生冲击。又该怎么理解这句话?还是上面那个例子,当尝试修改第一个字节68的时候,这一段二进制序列可能就完全变成了别的指令,甚至指令长度都会发生变化(比如把68改成90,那就变成了一个字节的nop指令),那么就认为这第一个字节是一个有意义的字节,修改了它会对指令的长度产生重要影响。反之,如果修改后面字节的数据,会发现这仍然是一条5个字节的压栈指令,长度没变化,也没有其他异常行为表现与之前不同,那么就认为后面几个字节是无关紧要的字节。在这个指导思想下,我们来看一个例子:从下面这一段数据开始出发:5b77483c-d4cc-11ec-bce3-dac502259ad0.png我们从两个字节的指令开始遍历:5b877360-d4cc-11ec-bce3-dac502259ad0.png把最后那个字节的内容+1,尝试去执行它:5b970866-d4cc-11ec-bce3-dac502259ad0.png发现指令长度没有变化,那就继续+1,再次尝试执行它:5ba819c6-d4cc-11ec-bce3-dac502259ad0.png一直这样加下去,直到发现加到4的时候,指令长度发生了变化,长度超过了2(但具体是多少还不知道,后文会解释):5bcbc2d6-d4cc-11ec-bce3-dac502259ad0.png那么在这个基础上,长度增加1位,以指令长度为3的指令来继续上面的探索过程:从最后一位开始+1做起。5bdd47ea-d4cc-11ec-bce3-dac502259ad0.png随着分析的深入,梳理一下指令搜索的路径图:5c09b56e-d4cc-11ec-bce3-dac502259ad0.png当某一条的最后一个字节遍历至FF时,开始往回走(就像递归,不能一直往下,总有回去的时候):5c3b728e-d4cc-11ec-bce3-dac502259ad0.png往回走一个字节,将其+1,继续再来:5c513330-d4cc-11ec-bce3-dac502259ad0.png按照这个思路,整个要搜索的指令空间压缩到可以接受遍历的程度:5c81a9c0-d4cc-11ec-bce3-dac502259ad0.png

如何判定指令长度

现在来解答前面遗留的一个问题。上面这个算法能够工作的一个重要前提是:我们得知道,给末尾字节+1后,有没有影响指令的长度。要判断某个字节是不是关键字节,就得知道这个字节的内容变化,会不会影响到指令长度,所以如果无法判断长度有没有变化,那上面的算法就无从谈起了。所以如何知道长度有没有变化呢?报告中用到了一个非常巧妙的方法。假设我们要评估下面这一串数据,前面开头到底多少个字节是一条完整指令。5cb11408-d4cc-11ec-bce3-dac502259ad0.png可能第一个字节0F就是一条指令。也可能前面两个字节0F 6A是一条指令。还可能前面五个字节0F 6A 60 6A 79 6D是一条指令。到底是什么情况,我们不知道,让我们用程序来尝试推导出来。准备两个连续的内存页面,前面一个拥有可执行的权限,后面一个不能执行。5ccfdbd6-d4cc-11ec-bce3-dac502259ad0.png记住:当CPU发现指令位于不可执行的页面中时,它会抛异常!现在,在内存中这样放置上面的数据流:第一个字节放在第一个页面的末尾位置,后面在字节放在第二个不可执行的页面上。5cf21f02-d4cc-11ec-bce3-dac502259ad0.png然后JMP到这条指令的地址,尝试去执行它,CPU中的译码器开始译码:5d0f38c6-d4cc-11ec-bce3-dac502259ad0.png译码器译码发现是0F,不是单字节指令,还需要继续分析后面的字节,继续取第二个字节:5d606ae8-d4cc-11ec-bce3-dac502259ad0.png但注意,第二个字节是位于不可执行的页面,CPU检查发现后会抛出页错误异常:5d6f3ab4-d4cc-11ec-bce3-dac502259ad0.png如果我们发现CPU抛了异常,并且异常的地址指向了第二个页面的地址,那么我们可以断定:这条指令的长度肯定不止一个字节。5d964280-d4cc-11ec-bce3-dac502259ad0.png既然不止一个字节,那就往前挪一下,放两个字节在可执行页面,从第三个字节开始放在不可执行页面,继续这个过程。5dc835ce-d4cc-11ec-bce3-dac502259ad0.png继续上面这个过程,放三个字节在可执行页面:5dd8f238-d4cc-11ec-bce3-dac502259ad0.png四个:5e02d0ee-d4cc-11ec-bce3-dac502259ad0.png当放了四个字节在可执行页面之后,事情发生了变化:指令可以执行了!虽然也抛了异常(因为天知道这是个什么指令,会抛什么异常),但页错误的地址不再是第二个页面的地址了!5e181e90-d4cc-11ec-bce3-dac502259ad0.png有了这个信号,我们就知道,前面4个字节是一条完整的指令:5e26b680-d4cc-11ec-bce3-dac502259ad0.png

挖掘隐藏指令

现在核心算法和判断指令长度的方法都介绍完了,可以正式来开挖,挖出那些隐藏的指令了!以一台Intel Core i7的CPU为目标,来挖一挖:5e52da3a-d4cc-11ec-bce3-dac502259ad0.png挖掘成果,收获颇丰:5e81527a-d4cc-11ec-bce3-dac502259ad0.png5eabeee0-d4cc-11ec-bce3-dac502259ad0.png这些都是Intel指令集手册中未交待,但CPU却能执行的指令。然后是AMD Athon的CPU:5ed36ee8-d4cc-11ec-bce3-dac502259ad0.png挖掘成果:5ee6eec8-d4cc-11ec-bce3-dac502259ad0.png那这些隐藏的指令是做什么的呢?有些已经被逆向工程分析了。还有的就是毫无记录,只有Intel/AMD自己人知道了,谁知道它们用这些指令是来干嘛的?软件即便是开源都能爆出各种各样的问题,何况是黑盒一样的硬件。CPU作为计算机中的基石,它要是出了问题,那可是大问题。我不是阴谋论,害人之心不可有,但防人之心不可无。看完这些,我对国产、安全、自主可控这几个字的理解又加深了一层。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11327

    浏览量

    225899
  • 编译器
    +关注

    关注

    1

    文章

    1672

    浏览量

    51912

原文标题:可怕!CPU 暗藏了这些未公开的指令!

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    工信部出手!整顿隐藏式门把手、智能驾驶等,这些车企已连夜整改

    电子发烧友网报道(文/黄山明)近几年新能源汽车呈现爆发式增长,其中各种新奇的功能以及酷炫的外表是吸引用户购买的重要因素。例如隐藏式门把手便成为不少新能源汽车的标配,尤其是隐藏式门把手可以让外形看起来
    的头像 发表于 05-13 01:07 8530次阅读

    指令集擦除」,一次搞定M.2/U.2/SSD硬盘

    指令集擦除功能支持M.2 NVMe/U.2/SSD硬盘,集成12+种Purge命令(Sanitize/Crypto/Format NVM等),自动适配品牌协议,符合IEEE-2883-2022与NIST-800-88r1国际标准,一键操作生成审计报告,彻底解决隐藏区数据泄
    的头像 发表于 03-10 17:33 544次阅读
    「<b class='flag-5'>指令</b>集擦除」,一次搞定M.2/U.2/SSD硬盘

    还在只主频选芯片?AI时代这个参数更重要

    这颗芯片主频多高?"如果还在用这个问题选AI处理器,可能已经踩坑。AI时代,决定的设备能不能流畅跑人脸识别、语音交互的,不是CPU主频,而是那个被忽略的NPU算力指标。行业观察今年
    的头像 发表于 02-03 11:43 477次阅读
    还在只<b class='flag-5'>看</b>主频选芯片?AI时代这个参数更重要

    简单认识音频时钟的精度与相噪

    前 3 期我们聊了音频时钟的核心作用、对音质的影响,以及多设备场景的应用 —— 但不少朋友都问:“精度 10ppm、相噪 -120dBc/Hz,这些数字到底是什么意思?选设备时该怎么看?”
    的头像 发表于 12-23 09:15 1016次阅读
    简单认识音频时钟的精度与相噪

    从代码执行单片机内存的分配

    取出送到CPU,即还要在存储器中取第二个字节。 其过程与取指阶段很相似,只是此时PC已为0001H。指令译码器结合时序部件,产生74H操作码的微操作系列,使数字E0H从0001H单元取出。 因为指令
    发表于 12-02 07:58

    时钟周期和指令周期的区别是什么

    时钟周期: 是硬件的时间单位,由主频直接决定。类似于音乐的节拍器,所有操作按此节奏同步。例如,72MHz 的 CPU 每秒完成 7200 万次时钟周期。 指令周期: 指令周期是软件视角的耗时
    发表于 11-21 07:01

    时钟周期、机器周期、指令周期介绍

    执行操作,以时钟作为驱动完成每一步。因此时钟周期决定了计算机的工作节奏,进而影响到计算机工作速度。 机器周期:通常用从内存中读取一个指令字的最短时间来规定CPU周期(机器周期),也即CPU完成一个
    发表于 11-17 07:54

    蜂鸟E203 mret/dret/wfi指令代表什么意思?

    蜂鸟E203 mret/dret/wfi指令代表什么意思,我手册上没有这三条指令
    发表于 11-10 07:31

    风华陶瓷电容型号怎么看

    及参数含义 1、封装尺寸 : 常见封装尺寸包括0201、0402、0603、0805、1206等,这些尺寸用于表示电容的物理大小。例如,0805表示长度是0.08英寸、宽度是0.05英寸。 2、介质种类 : 介质种类反映了电容的工作环境和工作温度要求。 常见介质
    的头像 发表于 11-07 17:38 1554次阅读
    风华陶瓷电容型号<b class='flag-5'>怎么看</b>?

    对浮点指令扩展中部分问题的解决与分享

    经过数周的前期准备与研读代码,我们组终于正式开始对浮点指令进行扩展并不出意外地遇到了一些小问题,本篇文章针对这些问题作出解决方法的分享。 一. 在e203_exu_decode中,发现变量
    发表于 10-24 08:14

    CPU 到 GPU,渲染技术如何重塑游戏、影视与设计?

    CPU(CentralProcessingUnit)是计算机的中央处理器,它负责执行各种程序和指令CPU渲染是指使用CPU来执行渲染流程
    的头像 发表于 09-01 12:16 1127次阅读
    从 <b class='flag-5'>CPU</b> 到 GPU,渲染技术如何重塑游戏、影视与设计?

    CPU里真的有黄金:看完秒懂

    在大家的印象中,黄金是珠宝、投资品和工业原料,但很少有人知道,我们每天使用的电脑CPU里竟然也隐藏着这种贵金属。那为什么芯片会用到黄金,一颗CPU中能有多少纯金呢?不依靠专业设备能提取出来吗?
    的头像 发表于 08-30 15:41 6486次阅读

    浮思特 | 不仅能测温!红外热成像还有这些隐藏技能

    说起红外热成像仪,第一时间想到的可能是消防员在浓烟中寻找被困人员,或者医生在体检时用它来测体温。但实际上,红外热成像的用途,远比你想象的要广!01红外热成像原理很简单红外热成像仪的核心原理,是将
    的头像 发表于 08-15 09:45 1325次阅读
    浮思特 | 不仅能测温!红外热成像还有<b class='flag-5'>这些</b><b class='flag-5'>隐藏</b>技能

    探索CPU架构的奥秘,揭秘高性能计算的隐形引擎

    的深海,揭开那些隐藏在高性能计算背后的神秘面纱。1.取指令(Fetch)程序计数器(PC):CPU通过程序计数器获取下一条指令的内存地址。指令
    的头像 发表于 08-13 11:58 963次阅读
    探索<b class='flag-5'>CPU</b>架构的奥秘,揭秘高性能计算的隐形引擎

    步进电机控制指令详解

    这些指令主要是针对用 PLC 直接联动伺服放大器,目的是可以不借助其他扩展设备(例如1GM 模块)来进行简单的点位控制, 使用这些指令时最好配合三菱的伺服放大器 (如 MR-J2)。然
    的头像 发表于 06-12 10:33 2295次阅读
    步进电机控制<b class='flag-5'>指令</b>详解