转自: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. 前端JS转图片为base64并压缩、调整尺寸脚本

    image to base64 to blob //////////////////////////////////////////////////////////////////////////// ...

  2. c#:无限极树形结构

    最近一直在研究树形结构菜单,无意中让我弄了出来.先上代码: 首先需要这个的一个类 public class Tree { public int id { get; set; } public stri ...

  3. Laravel 打印已执行的sql语句

    打开app\Providers\AppServiceProvider.PHP,在boot方法中添加如下内容 5.2以下版本 // 先引入DB use DB; // 或者直接使用 \DB:: DB::l ...

  4. 微信小程序中 this.setData is not a function报错

    在微信小程序中我们一般通过以下方式来修改data中的数据: 比如获取小程序缓存: wx.getStorage({ key: 'is_screen', success: function (res) { ...

  5. linux下mysql的权限设计总结

    1,进入mysql,终端中输入 mysql -u 用户名 -p   .enter键后,提示输入密码. 2,执行grant all privileges on xxxdb.* to usertest@& ...

  6. java中常用的swing组件 (2013-10-27-163 写的日志迁移

    五种布局:   流式布局(FlowLayout)边界布局(borderLayout)网格布局(GridLayout)  盒子布局(BoxLaYout)  空布局(null)  常用的几种 卡片布局(C ...

  7. 转 Laravel 的核心 —— 服务容器

    具体内容请参考 1.laravel 学习笔记 —— 神奇的服务容器 - 灵感 - 来自生活的馈赠https://www.insp.top/article/learn-laravel-container ...

  8. TS各个表 与 SECTION 的解析 CAS原理

    TS流,通过一个个的TS包来传送: TS包可以是传送PSI SI等各表的数据包,也可以是传送节目音视频数据(携带的PES包:音视频基本流包)的包:TS携带 PSI SI等表的数据时,各个表以各表对应的 ...

  9. 笔记-python-standard library-19.2 json

    笔记-python-standard library-19.2 json 1.      JSON简介 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级 ...

  10. 第八届蓝桥杯C/C++ B组省赛----分巧克力

    分巧克力 问题描述 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见,小明需要从这 N 块巧 ...