这只是一个关于ASLR如何实际防止缓冲区溢出的一般问题。我一直看到的声明是,它随机化了堆栈和可执行文件的地址空间。它接着说,要使这个漏洞发挥作用,需要可执行文件和堆栈的位置。这是我感到困惑的部分,所有的例子,我已经看到Bufferoverflow不麻烦自己找到这些东西的位置。这是我看过的一个例子,所有其他的例子都差不多,它没有提到或做任何与堆栈或可执行文件的位置有关的事情。这里是例子的链接,以防答案在那里,我不理解的东西:https://www.coengoedegebure.com/buffer-overflow-attacks-explained/: ~:文本= % 20 % 20缓冲区溢出发生% 20 % 20时,可能% 20接管% 20 % 20 % 20机。
对不起,如果这是一个愚蠢的问题
#include <string.h>
void func(char *name)
{
char buf[100];
strcpy(buf, name);
printf("Welcome %sn", buf);
}
int main(int argc, char *argv[])
{
func(argv[1]);
return 0;
}
一旦发生缓冲区溢出,我们希望将控制流重定向到已知的
让我们让它变得非常简单,并假设堆栈本身是可执行的。例如,我们可以用这个打开一个逆壳层。但是,我们究竟如何运行这个shellcode呢?
所以,我们要做的是溢出缓冲区,改变堆栈上的返回地址,指向堆栈本身(特别是,这个shellcode存在的堆栈的偏移量,我们可以使用gdb
来找到这些偏移量)。
但是,我们怎么知道堆栈的确切位置呢?
很久以前,在ASLR之前,堆栈总是在特定的位置,所以我们可以使用gdb
(例如)来找到堆栈的位置,并且只需将返回指针更改为指向堆栈(特别是我们的shellcode所在的位置)。
但是,使用ASLR,我们要么需要暴力强制堆栈位置,以及NOP雪橇(假设我们有足够的空间),要么通过另一个错误实现堆栈的地址披露。