【发布时间】:2021-12-30 17:06:57
【问题描述】:
我正在阅读这本书,名为 The Shellcoder's Handbook,然后我发现了以下信息:
现代计算机并没有真正区分指令和数据。如果 当处理器应该看到数据时,它可以得到指令,它会很高兴 继续执行传递的指令。这一特点使系统 可以利用。
那时我才意识到我们的现代系统是多么脆弱:( 但这本书有点老了,所以我做了一些研究,但找不到足够的信息让我满意。是否还没有任何方法可以区分Data和Instructions?
附带问题
典型的程序集文件包含三个段:
.text
.bss
和.data
还有其他方法可以区分这些吗? [无元数据]
【问题讨论】:
-
不可能,比特就是比特。火车轮子能分辨出下一段轨道是钢制的还是其他的?如果它甚至存在?当然不是,它不会知道它是否排成一行并保持到轮子接触它的那一刻。与处理器相同,在将位加载到解码器并尝试解码之前,不可能从指令中区分数据。一个有缺陷的程序实际上可能在处理器前面有数据,它会尽最大努力将这些位作为指令使用,因为无法分辨。处理器非常非常非常愚蠢....
-
从数据中正确确定指令的唯一方法是首先假设程序员和工具已经构建了符合体系结构及其规则的适当程序。其次,您必须从已知入口点开始,然后按执行顺序解码。因为某些指令路径可能来自用户输入等,您可能无法遵循所有这些路径,并且不能简单地假设您仅通过检查就知道跳转表的全部范围等。在过去甚至今天,有些树枝是伪造的,以甩掉拆卸,造成混乱。
-
一些二进制文件和文件格式将允许函数标签,允许用户/工具有更多的代码入口点。通过删除标签并将一两个字节扔到反汇编程序的路径中来混淆反汇编程序甚至是 gnu objdump 是微不足道的。
-
现代计算机与它无关,这就是逻辑的工作方式。你喂它一些东西,希望你在制作正确的东西方面做得对,就像你铺设一些火车轨道并希望你做对了,它不会撞到火车。
-
问题引用似乎是倒置的:你的意思是“如果一个处理器可以在它应该看到 instructions 时被馈送 data 它会很高兴地继续执行传递的数据 [作为指令]" ?
标签: assembly stack-overflow cpu-architecture microprocessors penetration-testing