课程实验报告
课 程 名 称: 计算机组成与结构
实验项目名称: buflab
专 业 班 级:
姓 名:
学 号:
指 导 教 师:
完 成 时 间: 2016 年 5 月 16 日
信息科学与工程学院
实验题目:buflab
实验目的:如writeup 中所说:这个实验帮助你具体地理解IA-32 机器的调用过程和堆栈的组织,
它会涉及到使用一系列缓冲区溢出攻击目录下的bufbomb 文件
这个实验中你会体验到第一次使用操作系统和网络服务下开发安全缺陷的方法,我们的目的是帮
助你理解程序的运行时所发生的内容,以及理解这种安全缺陷环境,从而帮助你避免在写代码时
误入歧途。
实验环境:ubuntu14.04 虚拟机、gdb 工具
实验内容及操作步骤:
首先按照readme 文件中所说,在linux 系统下解压压缩文件,得到三个文件
接下来开始阅读一下11 页的pdf 文件,明确这个实验的目标。
结合buflab-writeup 中的介绍,分析一下三个文件的作用:
Bufbomb 是要攻击的文件,makecookie 是基于个人id 生成的身份数据,我在本次实验中使用
的ID 为Mrspot ,hex2raw 文件协助进行字符串间的转化 (由于还没有做实验,所以只能基于字面
意思理解)
接下来,按照说明文件中的方法,生成一个属于自己的cookie
生成我的身份信息就是 0x2026ed1c,文件中接着说,5 个缓冲区攻击中的其中4 个,我的目
的都是要去使我的cookie 值出现在它平时不该出现的地方。
接着看下去,这个bufbomb 程序读入一串字符串,这个字符串是根据下面定义的getbuf 函数
来实现的:
Gets 函数和标准库函数内的gets 类似,读取一串以\n 结尾的字符串,并将其存储于特定目标
中,在getbuf 函数中,这个目标地址是一个有32 个字符型大小的数组。
然而这个Gets 的缺点是不能判断buf 是否足够存入所有的输入值,它只是简单地将整个字符
串赋值,经常会超出分配的存储空间。当错误信息出现时,缓冲区溢出导致程序被破坏,使存储
器路径错误
以下有几个控制语句:-u cookie ,使用这个语句是要确保不同的人使用不同的ID 做题,并攻
击不同的地址。-h 用于打印这几个操作的内容,-n 用于Level4 关卡,-s 用于提交你的解决方案到
服务器中。
我们可以把自己写好的exploit 文件写成txt 格式,并用以下方式应用到bufbomb 中去:
另外,还有一些重要的注意事项:
Exploit 文件中在任何位置都不能能包含0x0A,因为这是ASCII 码的换行编码,如果写了这个
语句,Gets 会认为你想终止字符串
HEX2RAW 期望输入的是空格隔开的两位16 进制数,如果你想创建一个值为0 的,就要输入
00,另外,注意小端法输入。
以上就是writeup 文件针对这个实验的说明,读完大概明白了几个文件的意思,但是要去做还
是一头雾水。所以我决定继续跟着这个writeup 的指导看下去。
Level0
接下来就开始了Level0 ,说的是getbuf 被bufbomb 中的test 功能调用,而这个test 的c 语言
代码如下:
Getbuf 函数如下:
Smoke 函数如下:
题目要求为:当test 函数在调用getbuf 函数时,本来这个程序会按照惯例返回test 函数,但是
我们要做的就是当getbuf 函数执行结束时,返回到smoke 函数中去。
几条建议为:1 反编译bufbomb ,2 小心字节顺序,3 使用gdb 确定自己做的对不对,4getbut
在堆栈中的位置取决于gcc 版本。
下面开始解题:
第一题很简单,应该是给大家入门的一个导引,大致的目的就是输入一个过长的字符串,把
getbuf 函数的返回地址覆盖掉,改成我们想要的smoke 函数的地址,那么就可以在getbuf 函数运
行结束时返回到smoke 函数中去。
下面根据反汇编的