四、Stack Canaries

首先看一下Stack Canaries演进历史:

Stack Guard 是第一个使用 Canaries 探测的堆栈保护实现,它于 1997 年作为 GCC 的一个扩展发布。最初版本的 Stack Guard 使用 0x00000000 作为 canary word。尽管很多人建议把 Stack Guard 纳入 GCC,作为 GCC 的一部分来提供堆栈保护。但实际上,GCC 3.x 没有实现任何的堆栈保护。

GCC4.1开始,引入了Stack-smashing Protection(SSP,又称 ProPolice),它实现了两个功能:

  1. 栈中插入Canaries,实现栈保护

  2. 变量重排机制,局部变量中的数组放到栈上高地址位置,其它类型变量放到栈上低地址位置,这使得通过溢出覆盖其它变量变得更加困难

Canaries值的生成,一般有几种方法:

  • Terminator canaries

    由于绝大多数的溢出漏洞都是由那些不做数组越界检查的 C 字符串处理函数引起的,而这些字符串都是以 NULL 作为终结字符的。选择 NULL, CR, LF 这样的字符作为 canary word 就成了很自然的事情。例如,若 canary word 为 0x000aff0d,为了使溢出不被检测到,攻击者需要在溢出字符串中包含 0x000aff0d 并精确计算 canaries 的位置,使 canaries 看上去没有被改变。然而,0x000aff0d 中的 0x00 会使 strcpy() 结束复制从而防止返回地址被覆盖。而 0x0a 会使 gets() 结束读取。插入的 terminator canaries 给攻击者制造了很大的麻烦。

  • Random canaries

    这种 canaries 是随机产生的。并且这样的随机数通常不能被攻击者读取。这种随机数在程序初始化时产生,然后保存在一个未被隐射到虚拟地址空间的内存页中。这样当攻击者试图通过指针访问保存随机数的内存时就会引发 segment fault。但是由于这个随机数的副本最终会作为 canary word 被保存在函数栈中,攻击者仍有可能通过函数栈获得 canary word 的值。

  • Random XOR canaries

    这种 canaries 是由一个随机数和函数栈中的所有控制信息、返回地址通过异或运算得到。这样,函数栈中的 canaries 或者任何控制信息、返回地址被修改就都能被检测到了。

一张图帮助理解:

下面通过调试,探索一下GCC中Canaries的具体实现。依然是使用Ubuntu x86环境,gcc version 4.9.2。

使用的程序代码如下:

void func()
{
     int i;
     char buffer[64];
     i = 1;
     buffer[0] = 'a';
} int main() 
{
     func();
     return 0;
}

分别编译开启栈保护和去除栈保护的程序:

ez@ubuntu:~/workdir/Canaries$ gcc -fstack-protector -o demo_sp demo.c

ez@ubuntu:~/workdir/Canaries$ gcc -fno-stack-protector -o demo_nosp demo.c

分别展示func函数的反汇编代码。

无栈保护代码:

(gdb) disass func 
Dump of assembler code for function func:
   0x080483eb <+0>: push   %ebp
   0x080483ec <+1>: mov    %esp,%ebp
   0x080483ee <+3>: sub    $0x50,%esp
   0x080483f1 <+6>: movl   $0x1,-0x4(%ebp)
   0x080483f8 <+13>: movb   $0x61,-0x44(%ebp)
   0x080483fc <+17>: leave  
   0x080483fd <+18>: ret    
End of assembler dump.
(gdb)

观察到,使用-fno-stack-protector选项编译的程序,栈上没有任何保护措施。

开启栈保护代码:

(gdb) disass func
Dump of assembler code for function func:
   0x0804843b <+0>: push   %ebp
   0x0804843c <+1>: mov    %esp,%ebp
   0x0804843e <+3>: sub    $0x58,%esp
   0x08048441 <+6>: mov    %gs:0x14,%eax     #读取gs寄存器,生成Canaries
   0x08048447 <+12>: mov    %eax,-0xc(%ebp)    #在栈底部写入Canaries
   0x0804844a <+15>: xor    %eax,%eax
   0x0804844c <+17>: movl   $0x1,-0x50(%ebp)
   0x08048453 <+24>: movb   $0x61,-0x4c(%ebp)
   0x08048457 <+28>: mov    -0xc(%ebp),%eax
   0x0804845a <+31>: xor    %gs:0x14,%eax    #函数返回前,检查Canaries值
   0x08048461 <+38>: je     0x8048468 <func+45>    #若未改变,跳到+45处正常返回
   0x08048463 <+40>: call   0x8048310 <__stack_chk_fail@plt>    #若发生栈溢出,执行__stack_chk_fail函数
   0x08048468 <+45>: leave  
   0x08048469 <+46>: ret    
End of assembler dump.
(gdb)

其中,从gs寄存器中读取的值,每次函数调用都是随机的,我们使用GDB调试验证之:

(gdb) b *0x08048447
Breakpoint 4 at 0x8048447
(gdb) r
Starting program: /home/ez/workdir/Canaries/demo_sp

Breakpoint 4, 0x08048447 in func ()
(gdb) i r eax
eax            0xa3850c00 -1551561728
(gdb) r
Starting program: /home/ez/workdir/Canaries/demo_sp

Breakpoint 4, 0x08048447 in func ()
(gdb) i r eax
eax            0xcc46de00 -867770880

通过跟踪__stack_chk_fail函数可以发现,它的实现比较复杂。大体流程是,首先调用__GI___fortify_fail函数,__GI___fortify_fail又调用__libc_message函数,__libc_message的最后调用backtrace_and_maps和__GI_abort函数,产生SIGABRT信号,并通过__GI___libc_secure_getenv根据系统环境变量决定是否产生coredump文件,__GI_abort执行到最后调用_exit,程序退出。

关于Canary名称的由来,我搜到一则有趣的小故事,矿井中的金丝雀

五、总结

    1. 所有具有任意代码执行能力的exp,均要绕过上述防护机制,本文只是拿缓冲区溢出举例,方法是通用的;

    2. 漏洞利用的关键是控制IP寄存器,但并不一定要直接覆盖,内核中大量的Ops结构,虚函数表,异常处理函数,GOT等都是很好的目标;

Linux_x86下NX与ASLR绕过技术(续)的更多相关文章

  1. Linux_x86下NX与ASLR绕过技术

    本文介绍Linux_x86下NX与ASLR绕过技术,并对GCC的Stack Canaries保护技术进行原理分析. 本文使用存在漏洞代码如下: /* filename : sof.c */ #incl ...

  2. SafeSEH原理及绕过技术浅析

    SafeSEH原理及绕过技术浅析 作者:magictong 时间:2012年3月16日星期五 摘要:主要介绍SafeSEH的基本原理和SafeSEH的绕过技术,重点在原理介绍. 关键词:SafeSEH ...

  3. Web安全--XSS现代WAF规则探测及绕过技术

    XSS现代WAF规则探测及绕过技术初始测试 1.使用无害的payload,类似<b>,<i>,<u>观察响应,判断应用程序是否被HTML编码,是否标签被过滤,是否过 ...

  4. 下周二推出“音视频技术WebRTC初探”公开课,欢迎捧场!

     下周二推出"音视频技术WebRTC初探"公开课,欢迎捧场! 公开课课程链接:http://edu.csdn.net/huiyiCourse/detail/90 课程的解说资料 ...

  5. (转)android平台下使用点九PNG技术

    “点九”是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:.9.png 智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向, ...

  6. [后渗透]Linux下的几种隐藏技术【转载】

    原作者:Bypass 原文链接:转自Bypass微信公众号 0x00 前言 攻击者在获取服务器权限后,会通过一些技巧来隐藏自己的踪迹和后门文件,本文介绍Linux下的几种隐藏技术. 0x01 隐藏文件 ...

  7. ASLR/DEP绕过技术概览

    在经典的栈溢出模型中,通过覆盖函数的返回地址来达到控制程序执行流程(EIP寄存器),通常将返回地址覆盖为0x7FFA4512,这个地址是一条JMP ESP指令,在函数返回时就会跳转到这个地址去执行,也 ...

  8. ModSecurity SQL注入攻击 – 深度绕过技术挑战

    ModSecurity是一个入侵探测与阻止的引擎,它主要是用于Web应用程序所以也可以叫做Web应用程序防火墙.它可以作为Apache Web服务器的一个模块或单独的应用程序来运行.ModSecuri ...

  9. [转]XSS现代WAF规则探测及绕过技术

    初始测试 1.使用无害的payload,类似<b>,<i>,<u>观察响应,判断应用程序是否被HTML编码,是否标签被过滤,是否过滤<>等等: 2.如果 ...

随机推荐

  1. HDU 6088 Rikka with Rock-paper-scissors(NTT+欧拉函数)

    题意 \(n\) 局石头剪刀布,设每局的贡献为赢的次数与输的次数之 \(\gcd\) ,求期望贡献乘以 \(3^{2n}\) ,定义若 \(xy=0\) 则,\(\gcd(x,y)=x+y\) 思路 ...

  2. robot framework---时间控件取值

    项目中遇到日期控件定位不了,网上各种找,并没有适合我的,目前通过Javascript已解决了,再次做个记录,方便自己日后查找,如有同样问题的同学也可以有个参考! 先说明,不同的定位方式是看开发同学如何 ...

  3. 大数据技术之_19_Spark学习_04_Spark Streaming 应用解析 + Spark Streaming 概述、运行、解析 + DStream 的输入、转换、输出 + 优化

    第1章 Spark Streaming 概述1.1 什么是 Spark Streaming1.2 为什么要学习 Spark Streaming1.3 Spark 与 Storm 的对比第2章 运行 S ...

  4. 716-River Crossing

    深奥dp,状态转来转去,反正就是能解题 #include <cstdio> #include <iostream> #include <cstring> #incl ...

  5. springboot添加多数据源 以及 动态添加数据源动态切换数据源

    <!-- Druid 数据连接池依赖 --> <dependency> <groupId>com.alibaba</groupId> <artif ...

  6. Probability和Likelihood的区别

    Bayes for Beginners: Probability and Likelihood 好好看,非常有用. 以前死活都不理解Probability和Likelihood的区别,为什么这两个东西 ...

  7. C# 实现邮件收取发送功能

    .Net调用QQ邮箱发送邮件   话说网上发送邮件的代码很多,但是我由于不细心,导致拿别人的代码发送邮件老是失败,今天就说说几个要注意的地方吧!!! ? 1 2 3 4 5 6 7 8 9 10 11 ...

  8. 7.7 GRASP原则七: 纯虚构 Pure Fabrication

    GRASP原则七: 纯虚构 Pure Fabrication  如果依据信息专家原则获得的解决方案不合适,既不想违反低耦合.高内聚,也不想违 反其他的原则, 该如何把职责分配给对象?  左右为难… ...

  9. 『流畅的Python』第1~4章笔记_数据结构、编码

    由于1~4章内容零散且基础,所以统计一下涉及到的内容,记录一下,方便查阅(第一张图右键新页面打开即可看到清晰大图)

  10. 万年不变话题cookie,简单总结

    cookie是面试中经常会问到的一个问题,但是就我的项目实践来看,我用到的次数极少.有时候用到也不是为了存储用户名密码,只是存储一些需要记住的状态.可能和我的经验尚浅,涉足的项目不算多有关.这里简单做 ...