Stack clash style attacks
·
hev
What is stack clash style attacks?
计算机上运行的程序都需要一块特殊的内存区域称为“栈”,栈空间通常是动态单向增长的,以Linux内核为例,操作系统为了防止栈空间过早分配产生的内存浪费,采用了栈延迟分配策略,按Page粒度逐步向低地址扩展增长。栈可用空间最低地址位置上有个特殊的页称为Stack Guard Page,当访问到达该页时,将触发严重错误,使程序终止执行。
攻击者故意分配较大的栈空间,但不触发访问,可有可能跳过对Stack Guard Page的访问,如果精心安排,或运气较好,就有可能将低地址方向的其它内存区域作为栈来使用,从而有机会突破栈不可执行保护。
How to prevent?
GCC编译器实现了stack clash protection功能,通过参数-fstack-clash-protection可启用。不是所有的目标架构都实现以支持该功能。
How it works?
GCC实现stack clash protection的方法是为每个函数生成一段代码,该代码执行在业务代码之前,按Page粒度逐个预访问函数framesize空间,达到一定能触发stack guard page访问的目的。
下面以一段MIPS架构汇编代码示例:
#include <stdio.h>
int
main (int argc, char *argv[])
{
char buffer[1024 * 1024];
printf ("%p", buffer);
return 0;
}
00000001200008d0 <main>:
1200008d0: 03a01825 move v1,sp
1200008d4: 3c0c0010 lui t0,0x10
1200008d8: 006c602f dsubu t0,v1,t0
1200008dc: 6463f000 daddiu v1,v1,-4096
1200008e0: 146cfffe bne v1,t0,1200008dc <main+0xc>
1200008e4: fc600000 sd zero,0(v1)
1200008e8: fd80fff0 sd zero,-16(t0)
1200008ec: 67bd8010 daddiu sp,sp,-32752
1200008f0: 3c03000f lui v1,0xf
1200008f4: ffbc7fe0 sd gp,32736(sp)
1200008f8: 3c1c0002 lui gp,0x2
1200008fc: 34638020 ori v1,v1,0x8020
120000900: 0399e02d daddu gp,gp,t9
120000904: ffbf7fe8 sd ra,32744(sp)
120000908: 03a3e82f dsubu sp,sp,v1
12000090c: 679c83d0 daddiu gp,gp,-31792
main函数prolugue中按4096的步长逐个写入了0。