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
我正在阅读有关 BOF(缓冲区溢出)攻击的信息,一种防止它的方法是使堆栈或堆不可执行。但这并不意味着我们不能有局部变量。通过使堆栈不可执行,我没有看到新行为。就 BOF 而言,可执行文件和 NX 堆栈之间的主要区别是什么?
基于堆栈的缓冲区溢出攻击的工作原理是
- 覆盖return地址,
- 将恶意代码置于堆栈的更上层。
return 地址的新值指向恶意代码中的正确位置。当函数returns时,它returns进入恶意代码,开始执行。
但回想一下,它在堆栈上。如果堆栈不可执行,程序就会崩溃,而不会执行坏的东西。
我现在明白什么是可执行堆栈了,计算机指令存储在.text 段中。堆栈部分包含函数参数、局部变量,我们还可以存储指令,因为它们是字节码。但默认情况下 CPU 不会执行存储在堆栈中的指令,因此要使 CPU 执行存储在堆栈中的代码,我们必须通过使堆栈可执行来告知。
gcc -m32 -z execstack -o shell exploit.c