checksec

checksec

Checksec.sh是一个bash脚本,用于检查一些可执行的属性,例如(PIE,RELRO,PaX,Canaries,ASLR,Fortify Source)。它最初是由Tobias Klein编写的,其原始资源可以在这里找到:checksec

1

  • 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
2
gcc -o test test.c
gcc -z execstack -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
2
3
gcc -o test test.c
gcc -fno-stack-protector -o test test.c
gcc -fstack-protector-all -o test test.c
0%