- 一、缓冲区溢出简介:
缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
-
二、实验具体步骤
1、准备工作
在实验楼64位的Linux环境下安装能用于编译32位C语言程序的包
2、关闭Linux系统的相关地址防护系统
Ubuntu和其他一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,让我们很难猜到地址。
sudo sysctl -w kernel.randomize_va_space=0
许多shell程序在被调用的时候会自动放弃特权,所以很难保持一个root权限。实验过程中这一步骤不能完全理解过程,所以就暂且放着。
然后进入Linux32位的环境。
3、编译漏洞程序
进入/tmp 目录新建一个stack文件,编译并设置SET-UID
SET-UID 给了一个普通用户能临时使用超级用户权限的途径。
GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。 而 -z execstack 用于允许执行栈。
4、编译攻击程序
在 /tmp 目录下新建一个 exploit.c 文件,为了节省时间,实验楼直接给了我们一个代码文件的链接。
wget http://labfile.oss.aliyuncs.com/courses/231/exploit.c
5、修改内存地址,进行覆盖
exploit.c文件中,x??x??x??x?? 处需要添上 shellcode 保存在内存中的地址,这里发生溢出后刚好能够覆盖返回地址。strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode 保存在 buffer + 100 的位置。所以我们通过gdb调试获得shellcode的地址。修改了exploit.c文件,进行编译。
6、运行程序
修改了地址保护机制后,运行不成功,显示段错误。
-
实验收获
感觉按照实验步骤一步一步来,确实能够得到相应的结果,但是整个实验也就是一个走了一个过程,还是没有弄懂相关内存溢出的具体流程,以及相关攻击的思路,自己的水平还是不达标,还有一段很长的路要走,有关老师上课提到的栈帧的知识点还需要弄懂。