二进制程序的保护措施

本文最后更新于:2020年4月11日 晚上

参考大佬博客:http://blog.eonew.cn/archives/222

ASLR

ASLR(地址随机化)是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。
但是,地址随机化不是对所有模块和内存区都进行随机化!虽然libc、栈、堆的加载位置被随机化,但主镜像不会。

Linux检查是否开启ASLR,命令:

cat /proc/sys/kernel/randomize_va_space

如果/proc/sys/kernel/randomize_va_space里的值为0时,则表示ASLR关闭。

可用下面的命令手动关闭:

echo -n "0" > /proc/sys/kernel/randomize_va_space -n表示不输出换行

Windows10强制开启ALSR,可以通过更改PE文件头里的Optional Header结构体里的DLL Characteristics字段,将DLL Characteristics字段的第7位设置为0即可关闭栈的ASLR,但是系统动态库的ALSR是强制开启的。

DEP

数据执行保护,默认栈的权限是可读、可写、不可执行。

gcc编译时通过参数-z execstack关闭该保护,-z noexecstack开启该保护。(-z 传参链接器)

PIE

PIE(position-independent executable, 地址无关可执行文件)技术就是一个针对代码段.text, 数据段.*data,.bss等固定地址的一个防护技术。同ASLR一样,应用了PIE的程序会在每次加载时都变换加载基址。

gcc编译时参数-fpie -pie开启PIE,-no-pie关闭PIE。

Stack Guard

编译器对栈溢出的一种保护机制,在函数执行时,先在栈上放置一个随机标识符,函数返回前会先检查标识符是否被修改,如果被修改则直接触发中断来中止程序,可以有效的防止栈溢出攻击。

gcc编译时传参-fno-stack-protector 就可以关闭 Stack Guard(CANARY)

RELRO

relro 是一种用于加强对 binary 数据段的保护的技术。relro 分为 partial relro 和 full relro。参数 -z norelro 是关闭RELRO保护。

Partial RELRO
现在gcc 默认编译就是 partial relro,参数是 -z relro
部分区块(比如:.init_array .fini_array .jcr .dynamic .got)在被动态装载(初始化)后,就被标记为只读区块。
Full RELRO
gcc编译参数是-z relro -z now
拥有 Partial RELRO 的所有特性,所有导入的符号都在 startup time 被解析

废话

还有一些保护,因为太菜,还没遇到过,想了解,可直接传送至开头博客。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!