Linux_x86下NX与ASLR绕过技术(续)

四、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;
}

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

[email protected]:~/workdir/Canaries$ gcc -fstack-protector -o demo_sp demo.c

[email protected]:~/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 <[email protected]>    #若发生栈溢出,执行__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名称的由来,我搜到一则有趣的小故事,矿井中的金丝雀

五、总结

  • 所有具有任意代码执行能力的exp,均要绕过上述防护机制,本文只是拿缓冲区溢出举例,方法是通用的;
  • 漏洞利用的关键是控制IP寄存器,但并不一定要直接覆盖,内核中大量的Ops结构,虚函数表,异常处理函数,GOT等都是很好的目标;
时间: 2024-12-05 21:58:27

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

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

XSS现代WAF规则探测及绕过技术初始测试 1.使用无害的payload,类似<b>,<i>,<u>观察响应,判断应用程序是否被HTML编码,是否标签被过滤,是否过滤<>等等: 2.如果过滤闭合标签,尝试无闭合标签的payload(<b,<i,<marquee)观察响应: 3.尝试以下的payload 1 <script>alert(1);</script> 2 <script>prompt(1);<

文件上传验证绕过技术总结

文件上传验证绕过技术总结 1.客户端验证绕过 很简单啦,直接使用webscarab或者burp修改一下后缀名就行. 2.服务端验证绕过-Content-type检测 若服务端检测文件类型时是检测Content-type的值,也很简单,在webscarab或者burp中修改Content-type. 如php中 if($_FILES['userfile']['type'] != "image/gif") 即是检测Content-type值. 3.服务端验证绕过-扩展名检测 a. 寻找漏网

linux下配置tomcat7 + solr4.9(续)--- 多核索引的配置

在上一篇文章中(详见http://www.cnblogs.com/bxljoy/p/3850263.html),我们已经介绍了tomcat+solr的索引服务器的配置,但是文中创建的服务器只能支持存储单一索引,很多情况下,我们需要对多个表或者多组不同的数据分别创建索引,如果没需要创建一个索引库,就要部署一套solr服务,那明显是不合算的,所以本文就来介绍一下solr的进阶应用,在同一台服务器中配置多核索引. 进入我们解压好的solr文件目录: cd /home/hadoop2/solr/exam

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

?? 下周二推出"音视频技术WebRTC初探"公开课,欢迎捧场! 公开课课程链接:http://edu.csdn.net/huiyiCourse/detail/90 课程的解说资料和代码将会在公开课结束后上传到 http://download.csdn.net/user/yangzhenping 以下是课程信息: 课程简单介绍 WebRTC的核心源于GIPS. GIPS(Global IP Sound)原是世界顶尖的互联网音视频方案提供商,于2010年被GOOGLE 用6820万美元收

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

“点九”是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:.9.png 智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向,在界面改变方向后,界面上的图形会因为长宽的变化而产生拉伸,造成图形的失真变形. 我们都知道android平台有多种不同的分辨率,很多控件的切图文件在被放大拉伸后,边角会模糊失真. OK,在android平台下使用点九PNG技术,可以将图片横向和纵向同时进行拉伸,以实现在多分辨率下的完美显示效果. [

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

ModSecurity是一个入侵探测与阻止的引擎,它主要是用于Web应用程序所以也可以叫做Web应用程序防火墙.它可以作为Apache Web服务器的一个模块或单独的应用程序来运行.ModSecurity的目的是为增强Web应用程序的安全性和保护Web应用程序避免遭受来自已知与未知的攻击.本文主要介绍了针对开源WAF的一次渗透测试比赛中的思路. 1. 文章背景 ModSecurity SQL Injection Challenge(ModSecurity发起的一个针对开源WAF的一次渗透测试比赛

【转】XSS现代WAF规则探测及绕过技术

原文 http://www.cnblogs.com/super-cj/p/3479708.html 初始测试 1.使用无害的payload,类似<b>,<i>,<u>观察响应,判断应用程序是否被HTML编码,是否标签被过滤,是否过滤<>等等: 2.如果过滤闭合标签,尝试无闭合标签的payload(<b,<i,<marquee)观察响应: 3.尝试以下的payload <script>alert(1);</script>

实时音视频互动系列(下):基于 WebRTC 技术的实战解析

在 WebRTC 项目中,又拍云团队做到了覆盖系统全局,保证项目进程流畅.这牵涉到主要三大块技术点: 网络端.服务端的开发和传输算法 WebRTC 协议中牵扯到服务端的应用协议和信令服务 客户端iOS.安卓 H.264 编解码技术 △ WebRTC 技术点 实时音视频互动必须遵守三大点 必须基于 UDP 协议,否则不要谈实时 因为 TCP 协议的重传机制(传输保障)会导致累积延迟问题,用 UDP 协议没有传输保障机制,但需要自行完善丢包容错逻辑. 又拍云音视频互动方案是基于UDP 协议,使用 T

“人工智能技术驱动下的机遇与挑战”技术分享会圆满成功!

2018年1月31日下午,在中科院计算所一层礼堂举行"大数据和人工智能技术驱动下的机遇与挑战"的技术分享会. 本次会议邀请了培训中心副校长谢新华老师,以及张云泉.彭晓辉.赵屹博士等中科院计算所在大数据.人工智能方向走在尖端的科技工作者,讲述当前流行的创新发展.人工智能.深度学习.物端计算系统.精准医学落地应用等话题.会议首先由中科院计算所党委委员.教育处处长李琳老师,培训中心王健华校长致欢迎辞. 谢新华老师讲的是"创新思维与知识体系",提到如何学习与提升创新能力,重