每次我们使用linux_server和IDA Pro远程调试Linux二进制文件时,堆栈地址都会更改吗? linux_server

我注意到当我进入一个子程序时,每次堆栈地址都是不同的。是预期的吗?是因为我正在远程调试吗?

#1 楼

在现代Linux机器上,默认情况下启用ASLR。结果,当在虚拟内存中创建二进制文件的过程映像时,堆栈的基地址位于一个随机偏移处:

/*
 * These are the functions used to load ELF style executables and shared
 * libraries.  There is no binary dependent code anywhere else.
 */

#ifndef STACK_RND_MASK
#define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12)) /* 8MB of VA */
#endif

static unsigned long randomize_stack_top(unsigned long stack_top)
{
    unsigned long random_variable = 0;

    if (current->flags & PF_RANDOMIZE) {
        random_variable = get_random_long();
        random_variable &= STACK_RND_MASK;
        random_variable <<= PAGE_SHIFT;
    }
#ifdef CONFIG_STACK_GROWSUP
    return PAGE_ALIGN(stack_top) + random_variable;
#else
    return PAGE_ALIGN(stack_top) - random_variable;
#endif
}


我们可以测试这可以通过一个简单的程序在函数main()中打印局部变量的内存地址来实现: />

评论


谢谢,我通过在计算机上手动禁用ASLR解决了此问题。

–Neon Flash
18-10-25在22:08

@NeonFlash不客气

– julian♦
18-10-25在22:36

#2 楼

大多数现代操作系统从不保证开始时不同过程创建时堆栈的位置将相同,这主要是在操作系统过程创建流程中确定性执行这些分配的副产品。

此外,然后在剥削过程中经常使用该事实为堆栈地址使用常量值,这是ASLR防止的。一段时间以来,堆栈已被ASLR化以减轻漏洞利用,实际上可以保证它们是随机的。