如何在CPU x86-64寄存器中执行不同的命令



几年前,一位老师曾对全班同学说,"通过CPU解析的所有东西都可能被利用"。

当时我对这个话题不太了解,但现在这个说法一直困扰着我和我我自己缺乏正确的词汇来在网上找到这个问题的答案,所以我恳请你帮忙。

我们上了关于"cat"、"grep"one_answers"less"的课,她说,在最坏的情况下,如果我们通过这些命令解析错误的内容,即使是这些命令也会造成伤害

我真的不明白她的意思。我知道CPU寄存器是如何工作的,我们还必须写一个教育缓冲区溢出,所以我也看到了寄存器中的汇编代码。我仍然没有得到以下内容:

  1. 命令是如何在CPU中执行的?例如,我使用"cat",所以某个地方会有命令的调用。但是,我输入的数据是如何解析到CPU的呢?如果我"cat"一个包含"helloworld"的.txt文件,我能在CPU寄存器的某个地方找到那个十六进制字符串吗?如果是:
  2. CPU如何知道不执行所述字符串
  3. 你能想到上面的命令可以被利用的场景吗?如果只有文本通过它进行解析,那怎么可能被利用呢?我有什么需要小心的

非常感谢!

机器代码通过CPU的指令提取部分在RIP(指令指针)指向的地址进行提取来执行CPU只能从内存中执行机器代码

通用寄存器从数据加载/存储指令(如mov eax, [rdi])中加载数据。将数据放入寄存器与将其作为机器代码执行完全无关。请记住,RIP是指针,而不是实际的机器代码字节。(RIP可以用跳转指令设置,包括间接跳转将GP寄存器复制到其中,或者ret将堆栈弹出到其中)。

这将有助于学习汇编语言的一些基础知识,因为您似乎遗漏了一些关键概念当整个前提似乎建立在对计算机如何工作的误解之上时,很难回答这个问题的安全部分。(如果不写一本关于汇编语言的书,我想我在这里很难弄清楚这一点。)我真正能做的就是向你介绍CPU架构的东西,它回答了指令如何执行的部分标题问题。(不来自寄存器)。

相关:

  • 计算机如何区分数据和指令?

  • 如何区分指令和数据?

  • 现代微处理器90分钟指南!涵盖了简单管道的基本获取/解码/执行周期。现代CPU可能有更复杂的内部结构,但从正确性/安全性角度来看,POV是等效的。(除了像Spectre和Meltdown这样依赖推测执行的漏洞)。

  • https://www.realworldtech.com/sandy-bridge/3/是对英特尔Sandybridge微体系结构的深入研究。这一页介绍了指令获取,展示了在实际CPU中是如何真正工作的。(AMD Zen相当相似。)


你一直在用";"解析";,但我认为你只是指";通过";。你不会"通过"解析"来解析内容;有些东西,但你可以"使内容通过";。无论如何,cat通常不涉及复制或查看用户空间中的数据,除非您运行cat -n来添加行号。

有关使用readwrite系统调用的普通cat的x86-64 Linux asm实现,请参阅通过x86-64汇编程序时的争用条件。除了命令行参数之外,它中没有任何内容与数据相关。被复制的数据永远不会加载到用户空间中的CPU寄存器中。

在内核内部,Linux对x86-64上的read()系统调用的实现中的copy_to_user通常会使用rep movsb进行复制,而不是使用具有单独加载/存储的循环,因此即使在内核中,数据也会从页面缓存、管道缓冲区或其他任何位置复制到用户空间,而实际上并不在寄存器中。(write将其复制到连接到的任何stdout也是如此。)

其他命令,如lessgrep,会将数据加载到寄存器中,但这不会直接导致数据作为代码执行的风险。

大多数事情已经由Peter回答了。不过,我想补充几点。

  1. 命令是如何在CPU中执行的?例如,我使用"cat",所以某个地方会有命令的调用。但是,我输入的数据是如何解析到CPU的呢?如果我"cat"一个包含"helloworld"的.txt文件,我能在CPU寄存器的某个地方找到那个十六进制字符串吗

cat不是由CPU cat.c直接执行的。您可以检查源代码并获得深入的视图。实际发生的情况是,每条指令都被转换为汇编指令,并由CPU执行。这些指令并不易受攻击,因为它们所做的只是移动一些数据和切换一些位。大部分漏洞是由于内存管理造成的,cat在过去也有漏洞。查看此以了解更多详细信息

  1. CPU如何知道不执行所述字符串

它没有。操作系统的工作是判断哪些要执行,哪些不执行。

  1. 你能想出任何可以利用上述命令的场景吗?如果只有文本通过它进行解析,那怎么可能被利用呢?我有什么需要小心的

您必须小心如何将文本文件传递到内存。您甚至可以制作自己的解释器来执行txt文件,然后解释器会告诉CPU如何执行该指令。

最新更新