转自: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. php微信分享demo

    php微信分享demo //定义JSSDK类 <?php class JSSDK { private $appId; private $appSecret; private $redis; pu ...

  2. Nodejs NPM CNPM优雅安装install

    由于npm和cnpm都能安装组件,安装的组件有的保存在c盘用户目录的Appdata隐藏目录下,有的保存在安装node的目录下,而且安装在c盘的话,重装系统又得重新部署,甚是麻烦,所以这里提供优雅安装的 ...

  3. 绘制三角形:imageline()

    <?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecol ...

  4. vue购物车的实现

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 树莓派下ubuntu-mate中ssh服务的安装与开机后自启动

    ssh程序分为客户端程序openssh-client和服务端程序openssh-server. 如果需要ssh登陆到别的电脑,需要安装openssh-client,该程序ubuntu是默认安装的.而如 ...

  6. Codeforces Round #464 (Div. 2) C. Convenient For Everybody

    C. Convenient For Everybody time limit per test2 seconds memory limit per test256 megabytes Problem ...

  7. 容斥原理:HDU-4135Co-prime

    容斥原理公式:这里就需要用到容斥原理了,公式就是:n/2+n/3+n/5-n/(2*3)-n/(2*5)-n/(3*5)+n/(2*3*5). 求的是多个重合区间的里面的数字个数. 解题心得: 1.一 ...

  8. Eclipse快速输出System.out.println();

    借鉴网上大佬博客 刚开始还好好敲代码 后来看博客发现其实输入syso或sysout 再按alt+/就OK 开始学JAVA,好好干.

  9. day09 threading, paramiko, queue 模块

    1 模拟ssh 2 锁 内部锁,程序锁,信号量 3 多线程 4  简单消息队列 先来看模拟ssh  ,python 的强大之处就是因为有很多模块,可以很简单的完成复杂的事情,今天我们用paramiko ...

  10. 【Gray Code】cpp

    题目: The gray code is a binary numeral system where two successive values differ in only one bit. Giv ...