linux安全机制学习【转】
转自: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安全机制学习【转】的更多相关文章
- linux IPC机制学习博客
要求 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 - 共享内存 - 管道 - FIFO - 信号 - 消息队列 研究博客 管道(PIPE) 管道(PIPE): ...
- 20135231 —— Linux 基础入门学习
20135231 何佳 学习计时:共12小时 读书:5 代码:2 作业:2 博客:3 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用Li ...
- Linux之RTOS学习
Linux之RTOS学习 RTOS: Real time operating system 系统选型 可选方案 RTLinux - FSMLabs, WindRiver Systems - http: ...
- Linux 内核协议栈 学习资料
终极资料 1.<Understanding Linux Network Internals> 2.<TCP/IP Architecture, Design and Implement ...
- [转帖]Linux分页机制之概述--Linux内存管理(六)
Linux分页机制之概述--Linux内存管理(六) 2016年09月01日 19:46:08 JeanCheng 阅读数:5491 标签: linuxkernel内存管理分页架构更多 个人分类: ┈ ...
- 20165308 预备作业3 Linux安装及学习
Linux安装及学习 Linux的安装 因为做的比较晚, 安装过程按照老师给出的步骤和同学指导并未出现很多问题,只是安装VirtualBox虚拟机增强功能时,代码没输正确,结果一直无法正确安装,后来也 ...
- Linux操作系统入门学习总结(2015.10)
用了差不多45天的时间把Linux操作系统入门的资料学习了下.主要阅读了以下几本书: 鸟哥的私房菜:Linux基础学习篇(第三版) "Running Linux" <LINU ...
- Linux设备驱动程序学习之分配内存
内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...
- Linux 内核list_head 学习
Linux 内核list_head 学习(一) http://www.cnblogs.com/zhuyp1015/archive/2012/06/02/2532240.html 在Linux内核中,提 ...
随机推荐
- jenkins+svn+pipeline+kubernetes部署java应用(三)
将jar包.Dockerfile.kubernetes部署yaml文件上传至svn自定义目录 一.生成流水线脚本 二.配置jenkins pipeline构建语句 三.点击构建java工程
- Python_day01_作业笔记
内容大纲: 1. python的出生与应用以及历史, python2x: 源码冗余,源码重复,源码不规范. python3x: 源码清晰优美简单. 2. python的种类. Cpython: 官 ...
- commons-logging日志实现解耦
一.需要解耦 日志是实际应用中的一个重要部分,日志系统也有许多开源的实现,如java.util.logging, logback, log4j系列等. 在使用日志系统时,如果与具体 ...
- CSU-2007 Football Training Camp
Football Training Camp 在一次足球联合训练中一共有n支队伍相互进行了若干场比赛. 对于每场比赛,赢了的队伍得3分,输了的队伍不得分,如果为平局则两支队伍各得1分. Input 输 ...
- Apache虚拟主机测试
一.虚拟机主机简介 部署多个站点,每个站点,希望用不同的域名和站点目录,或者是不同的端口,或不同的ip,就需要虚拟主机功能.简单的说一个http服务要配置多个站点,就需要虚拟主机.(一句话一个http ...
- 《鸟哥的Linux私房菜》学习笔记(4)——用户和组
一.用户和组的基本概念 1.用户 用户:用于获取计算机资源或服务的标识符,比如用户名.计算机处理的是UID,用 ...
- Redis实现之RDB持久化(二)
RDB文件结构 在Redis实现之RDB持久化(一)这一章中,我们介绍了Redis服务器保存和载入RDB文件的方法,在这一节,我们将对RDB文件本身进行介绍,并详细说明文件各个部分的结构和意义.图1- ...
- 设计模式之第20章-访问者模式(Java实现)
设计模式之第20章-访问者模式(Java实现) “嘿,你脸好红啊.”“精神焕发.”“怎么又黄了?”“怕冷,涂的,涂的,蜡.”“身上还有酒味,露馅了吧,原来是喝酒喝的啊.”“嘿嘿,让,让你发现了,今天来 ...
- 理解机器为什么可以学习(一)---Feasibility of learning
主要讲解内容来自机器学习基石课程.主要就是基于Hoeffding不等式来从理论上描述使用训练误差Ein代替期望误差Eout的合理性. PAC : probably approximately corr ...
- Leetcode 558.四叉树交集
四叉树交集 四叉树是一种树数据,其中每个结点恰好有四个子结点:topLeft.topRight.bottomLeft 和 bottomRight.四叉树通常被用来划分一个二维空间,递归地将其细分为四个 ...