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

How do different commands get executed in CPU x86-64 registers?

几年前一位老师曾经对 class 说过 'everything that gets parsed through the CPU can also be exploited'。

那时我对这个话题了解不多,但现在这个说法对我和我来说都是唠叨 我自己在网上找不到正确的词汇来回答这个问题,所以我恳请你的帮助。

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

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

  1. 命令是如何在 CPU 中执行的?例如我使用 'cat' 所以会调用命令。但是我输入的数据如何解析为 CPU?如果我 'cat' 一个包含 'hello world' 的 .txt 文件 - 我可以在 CPU 寄存器的某处以十六进制形式找到该字符串吗?如果是:
  2. CPU 如何知道所述字符串不会被执行?
  3. 您能想到上述命令可能被利用的任何场景吗? Afaik 只有文本通过它被解析,这怎么可能被利用?我需要注意什么?

非常感谢!

机器代码通过被 CPU 的 instruction-fetch 部分获取来执行,位于 RIP 指向的地址 instruction-pointer。 CPUs只能从内存中执行机器码。

General-purpose 寄存器从数据 load/store 指令中加载数据,例如 mov eax, [rdi]。将数据保存在寄存器中与将其作为机器代码执行完全无关。请记住,RIP 是一个 指针 ,而不是实际的 machine-code 字节。 (RIP可以设置跳转指令,包括间接跳转复制一个GP寄存器进去,或者ret弹出栈进去)。

学习汇编语言的一些基础知识会有所帮助,因为您似乎在那里遗漏了一些关键概念。 很难回答这个问题的安全部分,因为整个前提似乎都建立在对计算机工作原理的一些误解上。 (如果不写一本关于汇编语言的书,我认为我不能轻易弄清楚这里的问题。)我真正能做的就是向您指出 CPU-architecture 的内容,这些内容回答了标题问题的一部分,即如何执行指令。 (不是来自寄存器)。

相关:


你一直在使用“解析”这个词,但我认为你只是指“通过”。您不会“通过”某些东西“解析内容”,但可以“通过”传递内容。反正不会,cat通常不涉及复制或looking-at数据到user-space,除非你运行cat -n添加行号。

有关使用 readwrite 系统调用的普通 cat 的 x86-64 Linux asm 实现,请参阅 Race condition when piping through x86-64 assembly program。除了 command-line arg 之外,其中没有任何内容是 data-dependent。正在复制的数据永远不会加载到 CPU 寄存器 in user-space.

在内核中,copy_to_user 在 Linux 中对 x86-64 上的 read() 系统调用的实现通常会使用 rep movsb 作为副本,而不是使用单独的 load/store 进行循环,因此即使在内核中,数据也会从 page-cache、管道缓冲区或其他任何地方复制到 user-space,而实际上并没有在寄存器中。 (与 write 相同,将其复制到连接到的任何标准输出。)

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

Peter 已经回答了大部分问题。不过我想补充几点。

  1. How do commands get executed in the CPU at all? e.g. I use 'cat' so somehwere there will be a call of the command. But how does the data I enter get parsed to the CPU? If I 'cat' a .txt file which contains 'hello world' - can I find that string in HEX somewhere in the CPU registers?

cat 不直接由 CPU cat.c 执行。您可以检查源代码并深入了解。 . 实际发生的是每条指令都被转换为汇编指令,并由 CPU 执行。这些指令不容易受到攻击,因为它们所做的只是移动一些数据并切换一些位。大多数漏洞是由于内存管理和 cat 过去易受攻击 Check this for more detail

  1. How does the CPU know that said string is NOT to be executed?

没有。操作系统的工作是判断要执行什么,不执行什么。

  1. Could you think of any scencario where the above commands could get exploited? Afaik only text gets parsed through it, how could that be exploitable? What do I have to be careful about?

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