转自:http://blog.csdn.net/qq_20307987/article/details/51307820

曾经一度想学来着,今天看到一个链接,讲的很好,算是写一下加深印象吧

1 栈溢出保护

在程序编译的时候使用-fno-stack-protector标志来告诉gcc,不以栈溢出保护机制进行编译。如果我们没有指定这一个标志,会发生那个什么?
程序会使用fs:x来进行保护,这个地址指向了一个我们无法看到的随机值,并且fs是一个由内核维护的结构。

如果在GDB中调试的话,在$fs:x下断点,重复看几次,就能发现两次运行时值是不一样的,从而说明,fs中的数据值在每次运行中都是不同的,意味着攻击者不能准确的预测它。那么这个值是如何用来保护栈的呢?

在反汇编函数中可以看到,开头会把这个值拷贝到栈上,位于rbp-x的位置上,这个位置是在局部变量和指令指针之间的。

(译注:此处指返回地址和EBP)之间。这个值被称作金丝雀(“canary”)值,指的是矿工曾利用金丝雀来确认是否有气体泄漏,如果金丝雀因为气体泄漏而中毒死亡,可以给矿工预警。

与上述情况类似,当栈溢出发生时,金丝雀值将在已保存的指令指针被重写前先挂掉,看汇编代码,会发现在函数的最后会从栈中读那个值与原有值比较,如果这两个值一致,金丝雀(canary)没有被修改,从而认为保存的指令指针也没有被修改,进而允许函数正常的返回。如果金丝雀(canary)的值被修改了,栈溢出发生了,保存的指令指针可能也被修改了,因此不能安全返回,函数会调用__stack_chk_fail函数。这个函数会做些魔术,然后丢出一个错误退出进程。如下所示:

$ ./oldskool `perl -e 'print "A"x80'`
*** stack smashing detected ***: ./oldskool terminated
Aborted (core dumped)

2  NX:不可执行内存
去掉-fno-stack-protector是可以让栈溢出就是取消canary机制。而如果去掉-zexecstack标识,就允许执行栈中的代码了。
系统把需要写入数据的内存标识为可行,把保存指令的内存标识为可执行,但是不会有一块内存被同时表示为可写和可执行的。因此不可能在可执行的地方写入shellcode,也不可能在可写的地方执行shellcode.面对开启了NX保护,一种方式就是写ROP,这个技巧就是使用程序中已经有的代码段,也就是位于可执行文件的.text节里面的代码,使用一种方式把他们链接在一起,使他们看起来shellcode.
 如果开启了NX保护,执行栈上的数据就会报段错误

3 ASLR:地址空间随机化
通过在root下执行echo "0" > /proc/sys/kernel/randomize_va_space可以关掉ASLR
ALSR可以保证在每次程序加载的时候他自己和所加载的库文件都会被映射到虚拟地址空间的不同地址处,这就意味着我们不能使用自己在gdb中调试的地址了。因为有可能变成另一个。
注意:在我们调试一个程序的时候,GDB会自动关掉ASLR,但是为了更加真实地看到程序,可以把它打开。
 set disable-randomization off
 在gbd中设置之后,利用i poc map可以看函数映射表,大多数都不一一样,但是还有的模块是一样的。这就是在ASLR被开启的情况下,漏洞仍然可以利用成功的关键原因。

4 现代栈溢出攻击
 利用金丝雀可以保护程序在溢出的情况下不跳到SIP(指令指针)执行shellcode。但是金丝雀只是放在了SIP的前面,而不是栈中的局部变量里面。但是可以覆盖局部变量。有时候可以覆盖一个函数指针,而这个指针会在未来某一个时刻被执行。也有可能,我们覆盖了一个指针,这个指针指向的内存会在未来被写入用户数据,这样攻击者就可以在任意的位置写入数据了。类似的情形经常会被成功的利用而得到进程的控制权。比如GOT覆写。

具体的实验可以看链接提供的例子。

http://www.codeweblog.com/%E7%BF%BB%E8%AF%91-%E7%8E%B0%E4%BB%A3linux%E7%B3%BB%E7%BB%9F%E4%B8%8A%E7%9A%84%E6%A0%88%E6%BA%A2%E5%87%BA%E6%94%BB%E5%87%BB/

 
 

版权声明:本文为博主原创文章,未经博主允许不得转载。

linux安全机制学习【转】的更多相关文章

  1. linux IPC机制学习博客

    要求 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 - 共享内存 - 管道 - FIFO - 信号 - 消息队列 研究博客 管道(PIPE) 管道(PIPE): ...

  2. 20135231 —— Linux 基础入门学习

    20135231 何佳 学习计时:共12小时 读书:5 代码:2 作业:2 博客:3 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用Li ...

  3. Linux之RTOS学习

    Linux之RTOS学习 RTOS: Real time operating system 系统选型 可选方案 RTLinux - FSMLabs, WindRiver Systems - http: ...

  4. Linux 内核协议栈 学习资料

    终极资料 1.<Understanding Linux Network Internals> 2.<TCP/IP Architecture, Design and Implement ...

  5. [转帖]Linux分页机制之概述--Linux内存管理(六)

    Linux分页机制之概述--Linux内存管理(六) 2016年09月01日 19:46:08 JeanCheng 阅读数:5491 标签: linuxkernel内存管理分页架构更多 个人分类: ┈ ...

  6. 20165308 预备作业3 Linux安装及学习

    Linux安装及学习 Linux的安装 因为做的比较晚, 安装过程按照老师给出的步骤和同学指导并未出现很多问题,只是安装VirtualBox虚拟机增强功能时,代码没输正确,结果一直无法正确安装,后来也 ...

  7. Linux操作系统入门学习总结(2015.10)

    用了差不多45天的时间把Linux操作系统入门的资料学习了下.主要阅读了以下几本书: 鸟哥的私房菜:Linux基础学习篇(第三版) "Running Linux" <LINU ...

  8. Linux设备驱动程序学习之分配内存

    内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...

  9. Linux 内核list_head 学习

    Linux 内核list_head 学习(一) http://www.cnblogs.com/zhuyp1015/archive/2012/06/02/2532240.html 在Linux内核中,提 ...

随机推荐

  1. JZOJ 5185. 【NOIP2017提高组模拟6.30】tty's sequence

    5185. [NOIP2017提高组模拟6.30]tty's sequence (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB ...

  2. 2017 ACM-ICPC网络赛 H.Skiing 有向图最长路

    H.Skiing In this winter holiday, Bob has a plan for skiing at the mountain resort. This ski resort h ...

  3. 13,scrapy框架的日志等级和请求传参

    今日概要 日志等级 请求传参 如何提高scrapy的爬取效率 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy ...

  4. 图学java基础篇之集合工具

    两个工具类 java.utils下又两个集合相关_(准确来说其中一个是数组的)_的工具类:Arrays和Collections,其中提供了很多针对集合的操作,其中涵盖了一下几个方面: 拷贝.填充.反转 ...

  5. 基类View

    尽管类视图看上去类的种类繁多,但每个类都是各司其职的,且从类的命名就可以很容易地看出这个类的功能.大致可分为如下三个大的功能块,分别由三个类提供对应的方法: 处理 HTTP 请求.根据 HTTP 请求 ...

  6. “帮你APP”团队冲刺8

    1.整个项目预期的任务量 (任务量 = 所有工作的预期时间)和 目前已经花的时间 (所有记录的 ‘已经花费的时间’),还剩余的时间(所有工作的 ‘剩余时间’) : 所有工作的预期时间:88h 目前已经 ...

  7. leetcode 【 Container With Most Water 】python 实现

    题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...

  8. [转载]robotium脚本封装为APK,实现脱离手机数据线,使用按钮点击控制用例

    原文地址:robotium脚本封装为APK,实现脱离手机数据线,使用按钮点击控制用例运行作者:机器,猫 最近一直在完成一些robotium的小功能,用来更方便的完成一些小功能的测试,或者可以说用来娱乐 ...

  9. 使用shell脚本生成数据库markdown文档

    学习shell脚本编程的一次实践,通过shell脚本生成数据库的markdown文档,代码如下: HOST=xxxxxx PORT=xxxx USER="xxxxx" PASSWO ...

  10. Python操作MySQL+Redis+MongoDB

    1-1 python操作三大主流数据库导学篇 1-2 数据库简介 1-3 MySQL简介 2-1 MySQL安装及配置 2-2 MySQL图形化管理工具 2-3 SQL语法基础-创建并使用数据库 2- ...