在没有C编译器标志的情况下,在Ubuntu上禁用堆栈保护以防止缓冲区溢出


10

我想尝试一些shell代码,并且想禁用linux保护。

我知道我可以使用标志进行编译,但是我知道存在另一种禁用这些保护的方法,我只是不记得了。你能帮助我吗?

Answers:


6

堆栈保护由编译器完成(将一些额外的数据添加到堆栈中,并在调用时隐藏一些,在返回时检查完整性)。不重新编译就不能禁用它。这是重点的一部分,真的...


6
ASLR要求操作系统在运行时执行此操作。NX位也需要系统支持。在运行时不能禁用哪一部分?
杰夫·弗兰

25

为了扩展vonbrand所说的(正确地为+1),Linux的堆栈保护包括两个部分。

堆叠金丝雀

堆栈金丝雀是vonbrand所指的由编译器强制执行的功能。不重新编译就无法禁用这些功能。

为了向自己证明这一点并查看它们如何工作,请使用以下代码:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

int mybadfunction(char* a_bad_idea)
{
    char what[100];
    strcpy(what, a_bad_idea);
    printf("You passed %s\n", what);
}

int main(int argc, char** argv)
{
    printf("Tralalalaala\n");
    mybadfunction(argv[1]);
}

现在,将该(gcc -fstack-protector -masm=intel -S test.c)编译为gnu,以便于汇编和读取输出。重要的一点是,在mybadfunction函数退出时,有以下这段代码:

    mov edx, DWORD PTR [ebp-12]
    xor edx, DWORD PTR gs:20
    je  .L2
    call    __stack_chk_fail

您可能会猜到,这是从中获取堆栈Cookie [ebp-12]并将其与处的值进行比较gs:20。不匹配吗?然后,它__stack_chk_fail在glibc中调用一个函数,该函数会在那里杀死您的程序。

有一些方法可以解决漏洞,但是构建shellcode测试用例的简单方法是使用编译程序-fno-stack-protector

不可执行的页面

在现代Linux系统上还有其他一些注意事项。如果您使用通常的shellcode测试存根:

char buffer[] = {...};

typedef void (* func)(void);

int main(int argc, char** argv)
{
    func f = (func) buffer;
    f();
    return 0;
}

现代的GCC / Linux将.rodataPE文件的部分映射为只读,没有执行权限。您需要关闭它,可以使用此博客文章中的代码示例来完成。基本思想:mprotect用于将所需的权限添加到Shellcode数据所在的页面。

不可执行的堆栈

如果要使用shellcode测试传统的利用场景,例如上面的我的错误代码,那么您还需要确保堆栈对于简单情况是可执行的。PE文件格式包含一个用于确定堆栈是否可执行的字段,您可以使用execstack进行查询和控制。要启用可执行堆栈,请运行

execstack -s /path/to/myprog

可以在任意程序上完成,而无需重新编译,但不会自动禁用堆栈金丝雀,因为它们是在编译时生成的。

增加的奖励:aslr:

要关闭此功能,echo 0 > /proc/sys/kernel/randomize_va_space

您只是告诉别人如何利用我的珍贵企鹅吗?

否。任何利用都必须绕过堆栈金丝雀(非常不琐碎),并找到带有execstackset 的程序,或者对其进行设置(意味着它已经可以执行任意命令),或者使用更困难的技术,例如返回libc / return面向程序设计。


0

您可以使用这些选项禁用一些保护(堆栈破坏检测并使堆栈可执行)。

--z execstack
-f no-stack-protector

您还可以使用以下命令使用Bash关闭ASLR(地址空间布局随机化):

echo 0 > /proc/sys/kernel/randomize_va_space
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.