软件安全实验——pre5(缓冲区溢出漏洞预习)
Posted 大灬白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件安全实验——pre5(缓冲区溢出漏洞预习)相关的知识,希望对你有一定的参考价值。
目录标题
1、解释gcc参数-fno-stack-protector的含义,gcc的参数里面与stack overflow相关的还有哪些?
答:GCC 编译选项 -fno-stack-protector禁用栈保护功能,默认是启用的;
gcc 的栈保护机制是指,如果编译器支持堆栈预警,它将发出额外的代码,在输入函数时将预警值插入堆栈框架,并在退出时验证该值。
在栈的缓冲区(大小通常由程序员给定)写入内容前,在结束地址之后与返回地址之前,放入随机的验证码,由于栈帧是从内存高址段向内存低址段增长的,结束地址在高址段;返回地址在低址段,栈溢出时,会从高址段向低址段覆盖数据,因此如果想要覆盖返回地址的内容,必定先覆盖结束地址,验证码,才能覆盖返回地址,因此可以通过比较写入缓冲区前后的验证码是否发生改变,来检测并阻止溢出攻击。
-fstack-protector:启用栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码。-fstack-protector只保护字符串(缓冲区溢出攻击的主要问题目标),
-fstack-protector-all:启用栈保护,为所有函数插入保护代码。-fstack-protector-all保护所有类型
gcc的参数里面与stack overflow相关的还有
-z execstack:启用堆栈可执行机制,默认是禁用的;
-z noexecstack:关闭堆栈可执行机制
gcc编译器默认开启了NX选项,如果需要关闭NX选项,可以给gcc编译器添加-z execstack参数,NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。NX enabled如果这个保护开启就是意味着栈中数据没有执行权限,以前的经常用的call esp或者jmp esp的方法就不能使用,但是可以利用rop这种方法绕过。
2、(一定要看)非常仔细地阅读Smashing The Stack For Fun And Profit.
http://www.cs.wright.edu/people/faculty/tkprasad/courses/cs781/alephOne.html
缓冲区溢出,以及它们的漏洞利用是如何工作的
3、阅读下面两篇文章的同时,熟悉一下gdb基本操作,看汇编设断点查看内存之类的基本操作了解一点。
http://seanmurphree.com/blog/?p=157
IO 级别 8 – C++ 中的缓冲区/堆溢出
https://tomasuh.github.io/2015/01/19/IO-Wargame.html Level 3部分
格式化字符串漏洞解决方案级别 1-9
4、解释linux用root执行下面这条命令sysctl -w kernel.exec-shield=1的含义和用途。
答:kernel.exec-shield可执行栈保护,字面含义比较“绕”,实际上就是用来控制能否执行存储在栈中的代码,其值为1时表示禁止;为0时表示允许;默认为1,表示禁止执行栈中的代码,如此一来,即便覆盖了函数的返回地址导致栈溢出,也无法执行shellcode。
在当前版本的ubuntu中sysctl -w kernel.exec-shield=1已经被禁止使用。
以上是关于软件安全实验——pre5(缓冲区溢出漏洞预习)的主要内容,如果未能解决你的问题,请参考以下文章
2018-2019-1 20165228 《信息安全系统设计基础》缓冲区溢出漏洞实验报告
2018-2019-1 20165320 《信息安全系统设计基础》 缓冲区溢出漏洞实验
2018-2019-1 20165323《信息安全系统设计基础》缓冲区溢出漏洞实验报告