checksec
Checksec.sh是一个bash脚本,用于检查一些可执行的属性,例如(PIE,RELRO,PaX,Canaries,ASLR,Fortify Source)。它最初是由Tobias Klein编写的,其原始资源可以在这里找到:checksec。
PIE:地址随机化。如果程序开启了地址随机化选项(PIE enabled),意味着程序每次运行地址都会变化。如果程序没有开启地址随机化选项(No PIE),则程序的基地址为 (0x400000)。
RELRO:RELRO有Partial RELRO和FULL RELRO。如果开启FULL RELRO,意味着我们无法修改GOT表。
Stack:金丝雀机制。如果栈中开启Canary机制(Canary found),那么就不能直接用溢出的方法覆盖栈中返回地址,而且要通过改写指针与局部变量、leak canary、overwrite canary等方法来绕过。
NX:栈不可执行。如果开启NX保护,则栈中数据没有执行权限。call esp或jmp esp的方法无法使用,但可以利用rop的方法绕过。
FORTIFY:格式化字符串保护。FORTIFY_SOURCE机制对格式化字符串有两个限制:(1)包含%n的格式化字符串不能位于程序内存中的可写地址。(2)当使用位置参数时,必须使用范围内的所有参数。所以如果要使用%7$x,你必须同时使用参数1、2、3、4、5和6。
Linux常见的保护机制
1. NX(Windows中的DEP)
NX:No-eXecute
DEP:Data Execute Prevention
数据不可执行。
gcc编译选项(默认开启与关闭NX):
1 | gcc -o test test.c |
2. PIE(ASLR)
PIE:Position-Independent Excutable
ASLR:Address Space Layout Randomization
开启PIE选项编译可执行文件,可以使得elf文件拥有共享库属性。ASLR负责栈、库、堆等段的地址随机化。
关闭ASLR的bash命令:
1 | sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space" |
3. Canary(栈保护)
金丝雀(Canary)机制:函数每一次执行时,在栈上随机产生一个置于缓冲区和控制数据之间的Canary值。之后当函数执行结束返回时,检测Canary值,若不一致系统则报出异常。例如当发生缓冲区溢出时,该值则会被覆写。
gcc编译选项(默认关闭、禁用与启用栈保护):
1 | gcc -o test test.c |