Ton*_*ion 1 security callstack buffer-overflow
拥有调用堆栈允许代码执行多年来一直是许多安全问题的根源.堆栈缓冲区溢出可用于利用编写错误的软件,其中可以执行存储在堆栈缓冲区中的代码.
我只是想知道是否真的有一个原因,它不仅仅是不可执行的?为什么调用堆栈上的任何内容都需要可执行?
也许有一些历史原因
创建不可执行的堆栈需要硬件的帮助.早期的英特尔处理器没有NX位,直到386或奔腾才真正有用.(早期的处理器确实没有执行保护.但它并不是无处不在.)
在不同的时间,人们已经使用可执行堆栈甚至可写代码段来编写自修改程序.我想我们都同意自修改代码是一个坏主意,但我记得当我在80年代开始时对它有很多兴趣.如果你抛弃代码和数据之间任意分离的麻烦限制,你真的可以编写一些非常紧凑的程序.
说到这一点,执行数据和在堆栈中存储大量数据的概念是Lisp的重要组成部分.有关如何影响JIT编译器的讨论,请参阅在关闭NX位的情况下在Linux中分配数据页面.如果你想JIT编译非常小的东西,那么在堆栈上分配和运行它可能很方便.
也就是说,正如你所说,这是一个很大的问题,这就是为什么通常会有所偏离的原因.这让哈佛大学的一些建筑重新回到了我们大多数人都长大的冯·诺依曼建筑.