本文转载自:http://yunnigu.dropsec.xyz/2016/10/08/checksec及其包含的保护机制/

checksec及其包含的保护机制

今天在研究liunx下栈溢出的时候发现自己对各种保护机制并不是特别了解,因此就这方面的知识在网上查找了一些资料并总结了一些心得和大家分享。

操作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险,包括DEP、ASLR等。在编写漏洞利用代码的时候,需要特别注意目标进程是否开启了DEP(Linux下对应NX)、ASLR(Linux下对应PIE)等机制,例如存在DEP(NX)的话就不能直接执行栈上的数据,存在ASLR的话各个系统调用的地址就是随机化的。

一、checksec

checksec是一个脚本软件,也就是用脚本写的一个文件,不到2000行,可用来学习shell。

源码参见

http://www.trapkit.de/tools/checksec.html

https://github.com/slimm609/checksec.sh/

下载方法之一为

wget https://github.com/slimm609/checksec.sh/archive/1.6.tar.gz

checksec到底是用来干什么的?

它是用来检查可执行文件属性,例如PIE, RELRO, PaX, Canaries, ASLR, Fortify Source等等属性。

checksec的使用方法:

checksec –file /usr/sbin/sshd

一般来说,如果是学习二进制漏洞利用的朋友,建议大家使用gdb里peda插件里自带的checksec功能,如下:

下面我们就图中各个保护机制进行一个大致的了解。

二、CANNARY(栈保护)

这个选项表示栈保护功能有没有开启。

栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。

gcc在4.2版本中添加了-fstack-protector和-fstack-protector-all编译参数以支持栈保护功能,4.9新增了-fstack-protector-strong编译参数让保护的范围更广。

因此在编译时可以控制是否开启栈保护以及程度,例如:

gcc -fno-stack-protector -o test test.c  //禁用栈保护
gcc -fstack-protector -o test test.c   //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码
gcc -fstack-protector-all -o test test.c //启用堆栈保护,为所有函数插入保护代码

三、FORTIFY

这个保护机制查了很久都没有个很好的汉语形容,根据我的理解它其实和栈保护都是gcc的新的为了增强保护的一种机制,防止缓冲区溢出攻击。由于并不是太常见,也没有太多的了解。

举个例子可能简单明了一些:
一段简单的存在缓冲区溢出的C代码

void fun(char *s) {char buf[0x100];strcpy(buf, s);/* Don't allow gcc to optimise away the buf */asm volatile("" :: "m" (buf));
}

用包含参数-U_FORTIFY_SOURCE编译

08048450 <fun>:push   %ebp               ; mov    %esp,%ebpsub    $0x118,%esp        ; 将0x118存储到栈上mov    0x8(%ebp),%eax     ; 将目标参数载入eaxmov    %eax,0x4(%esp)     ; 保存目标参数lea    -0x108(%ebp),%eax  ; 数组bufmov    %eax,(%esp)        ; 保存call   8048320 <strcpy@plt>leave                     ; ret

用包含参数-D_FORTIFY_SOURCE=2编译

08048470 <fun>:push   %ebp               ; mov    %esp,%ebpsub    $0x118,%esp        ; movl   $0x100,0x8(%esp)   ; 把0x100当作目标参数保存mov    0x8(%ebp),%eax     ; mov    %eax,0x4(%esp)     ; lea    -0x108(%ebp),%eax  ; mov    %eax,(%esp)        ; call   8048370 <__strcpy_chk@plt>leave                      ; ret

我们可以看到gcc生成了一些附加代码,通过对数组大小的判断替换strcpy, memcpy, memset等函数名,达到防止缓冲区溢出的作用。

四、NX(DEP)

NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。

工作原理如图:

gcc编译器默认开启了NX选项,如果需要关闭NX选项,可以给gcc编译器添加-z execstack参数。
例如:

gcc -z execstack -o test test.c

在Windows下,类似的概念为DEP(数据执行保护),在最新版的Visual Studio中默认开启了DEP编译选项。

五、PIE(ASLR)

一般情况下NX(Windows平台上称其为DEP)和地址空间分布随机化(ASLR)会同时工作。

内存地址随机化机制(address space layout randomization),有以下三种情况

0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。

可以防范基于Ret2libc方式的针对DEP的攻击。ASLR和DEP配合使用,能有效阻止攻击者在堆栈上运行恶意代码。

Built as PIE:位置独立的可执行区域(position-independent executables)。这样使得在利用缓冲溢出和移动操作系统中存在的其他内存崩溃缺陷时采用面向返回的编程(return-oriented programming)方法变得难得多。

liunx下关闭PIE的命令如下:

sudo -s echo 0 > /proc/sys/kernel/randomize_va_space

六、RELRO

设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。

Title:checksec及其包含的保护机制

Author:Yun

Created:2016-10-08, 17:05:32

Updated:2016-11-28, 20:45:40

Full URL:http://yunnigu.dropsec.xyz/2016/10/08/checksec及其包含的保护机制/

License: "CC BY-NC-SA 4.0" Keep Link & Author if Distribute.

缓冲区溢出的保护机制相关推荐

  1. (SEED-Lab)Buffer Overflow Vulnerability Lab缓冲区溢出实验

    (SEED-Lab)Buffer Overflow Vulnerability Lab 欢迎大家访问我的GitHub博客 https://lunan0320.cn 文章目录 一.实验目的 二.实验步骤 ...

  2. 缓冲区溢出漏洞浅析(三)

    前面发了两篇都是关于C语言缓冲区溢出的文章,有的同行问,是否C#.Java语言有缓冲区溢出问题吗?答案是否定的.由于C#.Java语言需要虚拟机去执行,属于托管语言,虚拟机会自动检查边界.一般不会出现 ...

  3. VC++中利用/GS开关防止缓冲区溢出

    2019独角兽企业重金招聘Python工程师标准>>> 转自:http://www.2cto.com/kf/201006/47769.html 缓冲区溢出通常表现为一个最为常见的漏洞 ...

  4. java 缓冲区溢出_缓冲区溢出详解

    1 缓冲区溢出原理 缓冲区是一块连续的计算机内存区域,可保存相同数据类型的多个实例.缓冲区可以是堆栈(自动变量).堆(动态内存)和静态数据区(全局或静态).在C/C++语言中,通常使用字符数组和mal ...

  5. 缓冲区溢出漏洞攻击原理

    转自互联网 0x00 缓冲区溢出概念 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上, 理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但 ...

  6. 程序编译保护堆栈溢出保护机制

    目录 一,前言 二,堆栈溢出原理 三,操作系统内置的安全机制 四,参考 一,前言 缓冲区溢出(buffer-overflow)是一种非常普遍.同时非常危险的漏洞,在各种操作系统.应用软件中广泛存在.缓 ...

  7. 浅析mcafee的“缓冲区溢出保护”及绕过方法【安焦Leven】

    [mcafee的"缓冲区溢出保护"]     如果处在堆栈里的shellcode调用了getprocaddress等函数,mcafee会中止当前进程并报警. [分析原理]      ...

  8. 使用Linux进行缓冲区溢出实验的配置记录

    在基础的软件安全实验中,缓冲区溢出是一个基础而又经典的问题.最基本的缓冲区溢出即通过合理的构造输入数据,使得输入数据量超过原始缓冲区的大小,从而覆盖数据输入缓冲区之外的数据,达到诸如修改函数返回地址等 ...

  9. 从函数调用过程中的堆栈变化理解缓冲区溢出

    一.说明 本来是想直接写一个缓冲区溢出的例子,但是一是当前编译器和操作系统有溢出的保护措施没有完全弄清怎么取消,二是strcpy等遇到00会截断需要进行编码这比较难搞,所以最终没有实现. 但已经双看了 ...

最新文章

  1. 【BLE MIDI】MIDI 文件格式分析总结 ★★★
  2. 一致性hash算法原理
  3. how is __metadata.media_src generated in backend
  4. 实现打包后修改服务器接口地址,vue打包之后生成一个配置文件修改接口
  5. apollo报:系统出错,请重试或联系系统负责人
  6. 11 月全球 Web 服务器调查报告:nginx 表现最佳
  7. 根据IDC的数据,全球融合系统市场在2019年第四季度同比增长1.1%
  8. C#中sql备份与还原
  9. JDBC——Java连接关系型数据库
  10. mysql实验体会怎么写_数据库实验心得
  11. 计算机无法验证签名,你如何解决电脑无法验证数字签名的问题
  12. java实现pdf旋转_Java实现PDF文本旋转倾斜的方法
  13. 金刚经原文、注释、译文完整版
  14. 吉他屋-吉他谱-吉他教程
  15. 58同城iOS客户端Hybrid框架探索
  16. python-基于yagmail库开发自动邮件发送程序
  17. C++定义结构体大小根堆的方法
  18. 面试官扎心一问:NIO的原理是什么机制?
  19. Redis入门(五):Redis set命令和 Redis zset命令
  20. 有机光电二极管可应用在哪些领域

热门文章

  1. 绝地求生——PUBG吃鸡游戏模糊,画质很差
  2. KL Divergence 与 JS Divergence
  3. 浙江电信IPTV+上网 Padavan老毛子固件单线复用
  4. 亚马逊 Sessions 与 Pageviews 有什么区别?
  5. 【MATLAB】柱状图(bar的用法)
  6. Qt绘制柱状图BarChart、饼状图PieChart、堆叠柱状图StackedChart、散点图ScatterChart
  7. 【论文阅读|深读】GAS:Role-Oriented Graph Auto-encoder Guided by Structural Information
  8. 社交网络中节点重要性的度量
  9. 最好用的矢量绘图软件Sketch mac中文72.3
  10. linux刷新分区表,linux磁盘分区的详细步骤(图解linux分区命令使用方法)