BOF 中的可执行文件与 NX 堆栈?

Executable vs NX stack in BOF?

我正在阅读有关 BOF(缓冲区溢出)攻击的信息,一种防止它的方法是使堆栈或堆不可执行。但这并不意味着我们不能有局部变量。通过使堆栈不可执行,我没有看到新行为。就 BOF 而言,可执行文件和 NX 堆栈之间的主要区别是什么?

基于堆栈的缓冲区溢出攻击的工作原理是

  • 覆盖return地址,
  • 将恶意代码置于堆栈的更上层。

return 地址的新值指向恶意代码中的正确位置。当函数returns时,它returns进入恶意代码,开始执行。

但回想一下,它在堆栈上。如果堆栈不可执行,程序就会崩溃,而不会执行坏的东西。

我现在明白什么是可执行堆栈了,计算机指令存储在.text 段中。堆栈部分包含函数参数、局部变量,我们还可以存储指令,因为它们是字节码。但默认情况下 CPU 不会执行存储在堆栈中的指令,因此要使 CPU 执行存储在堆栈中的代码,我们必须通过使堆栈可执行来告知。

gcc -m32 -z execstack -o shell  exploit.c