2018-2019-1 20165306《信息安全系统设计基础》第三周学习总结
缓冲区溢出漏洞实验
- 缓冲区溢出是指程序试图向缓冲区写入超出固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制。甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
一、实验准备
- 输入命令安装一些用于32位C程序的软件包
二、实验步骤
1.初始设置
-
Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆和栈的初始地址,使得猜测准确地内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。需关闭这一功能。
-
为了进一步防范缓冲区溢出攻击及其他用shell程序的攻击,许多shell程序在被调用时自动放弃他们的特权。为了重现防护措施被实现之前的情形,使用另一个shell程序(zsh)代替
/bin/bash
。
2.shellcode
- 一般情况下,缓冲区溢出会造成程序崩溃。在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是shellcode。
3.漏洞程序
- 在
/tmp
目录下新建一个stack.c
文件:
- GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以在编译代码时需要用
-fno-stack-protector
关闭这种机制。而-z execstack
用于允许执行栈。-g
参数是为了使编译后得到的可执行文档能用gdb调试。
4.攻击程序
- 在
/tmp
目录下新建一个exploit.c
文件:
- 编译
exploit.c
程序
gcc -m32 -o exploit exploit.c
代码调试中的问题和解决过程
FILE *badfile
误输成了File *badfile
,导致编译失败。