Pha*_*ate 10 linux compiling security
我想尝试一些 shell 代码,我想禁用 linux 保护。
我知道我可以使用标志进行编译,但我知道存在另一种方法来禁用这些保护,我只是不记得了。你能帮助我吗?
小智 28
为了扩展冯布兰德(正确地,+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]);
}
Run Code Online (Sandbox Code Playgroud)
现在将那个 ( 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
Run Code Online (Sandbox Code Playgroud)
您可以猜到,这是从 cookie 中获取堆栈 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;
}
Run Code Online (Sandbox Code Playgroud)
现代 GCC/Linux 将映射.rodata
PE 文件的部分只读,没有执行权限。您需要关闭它,这可以使用此博客文章中的代码示例来完成。基本思想:你用来mprotect
给shellcode数据所在的页面添加你想要的权限。
如果你打算用你的 shellcode 测试一个传统的漏洞利用场景,例如我上面的坏代码,那么你还需要确保堆栈对于简单的情况是可执行的。PE 文件格式包含一个用于确定堆栈是否可执行的字段——您可以使用execstack查询和控制它。要启用可执行堆栈,请运行
execstack -s /path/to/myprog
Run Code Online (Sandbox Code Playgroud)
这可以在任意程序上完成而无需重新编译,但不会自动禁用堆栈金丝雀,因为它们是在编译时嵌入的。
要关闭它,echo 0 > /proc/sys/kernel/randomize_va_space
.
不。任何漏洞利用都必须绕过堆栈金丝雀(非常重要),或者找到一个带有execstack
set的程序,或者设置它(意味着它已经可以执行任意命令)或者使用更困难的技术,例如返回 libc/return面向编程。
堆栈保护由编译器完成(向堆栈添加一些额外数据并在调用时将一些数据隐藏起来,返回时检查完整性)。不重新编译就不能禁用它。这是重点的一部分,真的......
归档时间: |
|
查看次数: |
28377 次 |
最近记录: |