如何在 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 寄存器是如何工作的,我们还必须编写教育缓冲区溢出,所以我也在寄存器中看到了汇编代码。
我仍然没有得到以下信息:
- 命令是如何在 CPU 中执行的?例如我使用 'cat' 所以会调用命令。但是我输入的数据如何解析为 CPU?如果我 'cat' 一个包含 'hello world' 的 .txt 文件 - 我可以在 CPU 寄存器的某处以十六进制形式找到该字符串吗?如果是:
- CPU 如何知道所述字符串不会被执行?
- 您能想到上述命令可能被利用的任何场景吗? Afaik 只有文本通过它被解析,这怎么可能被利用?我需要注意什么?
非常感谢!
机器代码通过被 CPU 的 instruction-fetch 部分获取来执行,位于 RIP 指向的地址 instruction-pointer。 CPUs只能从内存中执行机器码。
General-purpose 寄存器从数据 load/store 指令中加载数据,例如 mov eax, [rdi]
。将数据保存在寄存器中与将其作为机器代码执行完全无关。请记住,RIP 是一个 指针 ,而不是实际的 machine-code 字节。 (RIP可以设置跳转指令,包括间接跳转复制一个GP寄存器进去,或者ret
弹出栈进去)。
学习汇编语言的一些基础知识会有所帮助,因为您似乎在那里遗漏了一些关键概念。 很难回答这个问题的安全部分,因为整个前提似乎都建立在对计算机工作原理的一些误解上。 (如果不写一本关于汇编语言的书,我认为我不能轻易弄清楚这里的问题。)我真正能做的就是向您指出 CPU-architecture 的内容,这些内容回答了标题问题的一部分,即如何执行指令。 (不是来自寄存器)。
相关:
How does a computer distinguish between Data and Instructions?
-
现代微处理器
90 分钟指南! 涵盖了简单管道 的基本 fetch/decode/execute 循环。现代 CPUs 可能有更复杂的内部结构,但从正确性/安全性 POV 来看是等价的。 (除了依赖于推测执行的 Spectre 和 Meltdown 等漏洞)。
https://www.realworldtech.com/sandy-bridge/3/ 是英特尔 Sandybridge 微架构上的 deep-dive。涵盖 instruction-fetch 的那一页展示了 真正 在真实的 CPU 中是如何工作的。 (AMD Zen 非常相似。)
你一直在使用“解析”这个词,但我认为你只是指“通过”。您不会“通过”某些东西“解析内容”,但可以“通过”传递内容。反正不会,cat
通常不涉及复制或looking-at数据到user-space,除非你运行cat -n
添加行号。
有关使用 read
和 write
系统调用的普通 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
相同,将其复制到连接到的任何标准输出。)
其他命令,如 less
和 grep
,会将数据加载到寄存器中,但这不会直接引入任何将其作为代码执行的风险。
Peter 已经回答了大部分问题。不过我想补充几点。
- 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
- How does the CPU know that said string is NOT to be executed?
没有。操作系统的工作是判断要执行什么,不执行什么。
- 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 如何执行该指令。
几年前一位老师曾经对 class 说过 'everything that gets parsed through the CPU can also be exploited'。
那时我对这个话题了解不多,但现在这个说法对我和我来说都是唠叨 我自己在网上找不到正确的词汇来回答这个问题,所以我恳请你的帮助。
我们上过关于 'cat'、'grep' 和 'less' 的课程,她说在最坏的情况下,如果我们通过它解析错误的内容,即使这些命令也会造成伤害。
我真的不明白她是什么意思。我确实知道 CPU 寄存器是如何工作的,我们还必须编写教育缓冲区溢出,所以我也在寄存器中看到了汇编代码。 我仍然没有得到以下信息:
- 命令是如何在 CPU 中执行的?例如我使用 'cat' 所以会调用命令。但是我输入的数据如何解析为 CPU?如果我 'cat' 一个包含 'hello world' 的 .txt 文件 - 我可以在 CPU 寄存器的某处以十六进制形式找到该字符串吗?如果是:
- CPU 如何知道所述字符串不会被执行?
- 您能想到上述命令可能被利用的任何场景吗? Afaik 只有文本通过它被解析,这怎么可能被利用?我需要注意什么?
非常感谢!
机器代码通过被 CPU 的 instruction-fetch 部分获取来执行,位于 RIP 指向的地址 instruction-pointer。 CPUs只能从内存中执行机器码。
General-purpose 寄存器从数据 load/store 指令中加载数据,例如 mov eax, [rdi]
。将数据保存在寄存器中与将其作为机器代码执行完全无关。请记住,RIP 是一个 指针 ,而不是实际的 machine-code 字节。 (RIP可以设置跳转指令,包括间接跳转复制一个GP寄存器进去,或者ret
弹出栈进去)。
学习汇编语言的一些基础知识会有所帮助,因为您似乎在那里遗漏了一些关键概念。 很难回答这个问题的安全部分,因为整个前提似乎都建立在对计算机工作原理的一些误解上。 (如果不写一本关于汇编语言的书,我认为我不能轻易弄清楚这里的问题。)我真正能做的就是向您指出 CPU-architecture 的内容,这些内容回答了标题问题的一部分,即如何执行指令。 (不是来自寄存器)。
相关:
How does a computer distinguish between Data and Instructions?
现代微处理器 90 分钟指南! 涵盖了简单管道 的基本 fetch/decode/execute 循环。现代 CPUs 可能有更复杂的内部结构,但从正确性/安全性 POV 来看是等价的。 (除了依赖于推测执行的 Spectre 和 Meltdown 等漏洞)。
https://www.realworldtech.com/sandy-bridge/3/ 是英特尔 Sandybridge 微架构上的 deep-dive。涵盖 instruction-fetch 的那一页展示了 真正 在真实的 CPU 中是如何工作的。 (AMD Zen 非常相似。)
你一直在使用“解析”这个词,但我认为你只是指“通过”。您不会“通过”某些东西“解析内容”,但可以“通过”传递内容。反正不会,cat
通常不涉及复制或looking-at数据到user-space,除非你运行cat -n
添加行号。
有关使用 read
和 write
系统调用的普通 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
相同,将其复制到连接到的任何标准输出。)
其他命令,如 less
和 grep
,会将数据加载到寄存器中,但这不会直接引入任何将其作为代码执行的风险。
Peter 已经回答了大部分问题。不过我想补充几点。
- 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
- How does the CPU know that said string is NOT to be executed?
没有。操作系统的工作是判断要执行什么,不执行什么。
- 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 如何执行该指令。