BetaMao

系统保护

字数统计: 756阅读时长: 2 min
2017/09/06 Share

本篇记录一些常见的系统防护手段(运行时保护策略),持续更新,未完待续

Windows


这是0day安全里面的图,可以看到在n年前Windows就有了多种保护机制,而且不同系统机制也不同,如今保护方式更是复杂,这或许也是ctf的pwn为Linux下的原因吧。

GS

DEP

ASLR

这是Kernel Version 6 开始采用的技术,就是XP后都支持了,它会使PE文件在每次加载到内存的其实地址都会随机变化(含代码),并且堆栈也会随机变化,它也需要软件支持此功能,编程工具和系统会默认开启此功能,可以关闭他们:

软件支持ASLR则一般都有.reloc节区,在PE中海油些其他的不同:



删除DllCharacteristics的Dll can move属性即可去掉ALSR功能:

直接使用CFF就可以去掉,不过作者说这样不好,应该用winhex这类工具,有利于技术提升。。。

Linux

stack canary

同Windows的GS,缓解措施:

  1. 变量重排:局部变量->数组->哨位->EBP值->RET值
  2. 哨位(探测仪)是随机不可测的
  3. 默认对有数组的函数实施保护

设置方式例:

1
2
3
4
-fno-stack-protector
-fstack-protector
-fno-stack-protector-all
-fstack-protector-all

对抗措施:

  1. fork下可以爆破
  2. 格式化串等可以读
  3. perror

ASLR

有三个选项开关:

  • 0 - 表示关闭进程地址空间随机化。
  • 1 - 表示将mmap的基址,stack和vdso页面随机化。
  • 2 - 表示在1的基础上增加堆(heap)的随机化。

设置方式例:

1
echo 0 >/proc/sys/kernel/randomize_va_space
  1. http://www.cnblogs.com/wangaohui/p/7122653.html

PIE

PIE指的是位置无关的可执行程序,用于生成位置无关的可执行程序,所谓位置无关的可执行程序,指的是,可执行程序的代码指令集可以被加载到任意位置,进程通过相对地址获取指令操作和数据,如果不是位置无关的可执行程序,则该可执行程序的代码指令集必须放到特定的位置才可运行进程。

1
2
-no-pie
-pie #默认开启
  1. http://blog.sina.com.cn/s/blog_ae9847da01018l0v.html
  2. https://www.cnblogs.com/yanqi0124/p/4816343.html
    pic:对于库来说的
    对策:
  1. 在一些旧版本上伪随机熵不够可以使用爆破,即多次重复同样地址。

NX

data bss stack heap等不可执行,可使用如下开关参数:

1
2
-z noexecstack
-z execstack

FORTIFY_SOURCE

固定参数,主要用来防格式化串,它会让%12$s在前12个参数没被用到时失效并且会组织%n的对应地址在可写的区域上。使用-O2 -D_FORTIFY_SOURCE=2打开(1表示编译时检查,2加了运行时溢出检查)。

RELRO

重定位区域只读,默认是部分只读,此时GOT表依然可写,当改为full时GOT也只读,重定位将会发生在程序开始前。可使用如下开关参数:

1
2
3
-z now
-z lazy
-z norelro
CATALOG
  1. 1. Windows
    1. 1.1. GS
    2. 1.2. DEP
    3. 1.3. ASLR
  2. 2. Linux
    1. 2.1. stack canary
    2. 2.2. ASLR
    3. 2.3. PIE
    4. 2.4. NX
    5. 2.5. FORTIFY_SOURCE
    6. 2.6. RELRO