IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Stack clash style attacks

    hev发表于 2022-05-27 07:05:36
    love 0

    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。



沪ICP备19023445号-2号
友情链接