实验要求
对一个可执行程序“bufbomb”实施一系列5个难度递增的缓冲区溢出攻击缓冲区溢出攻击(buffer overflow attacks)——
即设法通过造成缓冲区溢出来改变该可执行程序的运行内存映像(栈帧
例如将给定的字节序列插入到其本不应出现的内存位置。
- 5个难度级:
- smoke (level 0)
- fizz (level 1)
- bang (level 2)
- boom (level 3)
- kaboom (level 4)
- smoke级最简单,kaboom级最困难
实验资料
- 实验数据包:bufferlab-handout.tar
- 解压命令:tar xf bufferlab-handout.tar
- 包含下列文件:
- bufbomb:实验中实施缓冲区溢出攻击的目标程序
- makecookie
该程序基于命令行参数(用户号/学号)产生一个唯一的由8个16进制数字组成的字节序列(例如0x1005b2b7)
称为“cookie”,用作实验中需要置入栈中的数据之一并区分不同学生的实验
./makecookie 你的学号,即可生成你的唯一的cookie - hex2raw:字符串格式转换程序
目标程序介绍
- bufbomb程序接受下列命令行参数:
-
userid
以给定的用户ID“userid”(例如学号)运行程序。
每次在运行程序时均应指定该参数
因为bufbomb程序将基于userid决定内部使用的cookie值(同makecookie程序的输出)
在bufbomb程序内部,一些关键的栈地址取决于userid所对应的cookie值。 -
-h:打印可用命令行参数列表
-
-n:以“Nitro”模式运行,专用于Level 4实验阶段(栈状态会不一样,自己体会)
-
一个小小的演示
实验前的准备
攻击方法
一点点关于字符串的说明
设攻击字符串包含于文件Solution.txt中,
可使用如下命令测试攻击字符串在bufbomb上的运行结果,并与相应难度级的期望输出对比,以验证通过与否
cat solution.txt | ./hex2raw | ./bufbomb -u [userid]
其中solution.txt是你的攻击字符串, hex2raw是将你的字符串由16进制状态转为文本然后输出到输入
userid 请填 你的学号
简而言之,你需要构造的是用十六进制表示的字符串(注意大端小端的区别)并用工具来输入
Somke的演示
准备工作
首先进行的是前四关的分析,这时候。缓冲区的大小是确定的
数组的首地址也是确定,因此先进行一些准备工作。
我们首先进行代码的分析:
可见在栈内为数组开辟的大小为50字节的内存。所以为了覆盖返回地址
应该写入50+4+4也就是58个字节的数据,其中最后四个字节是要篡改的地址。
- 首先在反汇编文件内找到smoke函数的首地址,也就是程序开始的地址
可见,smoke的首地址是08048ba1,所以将这个值写在第55到58个字节就能实现攻击。
- 考虑到小端排序,写出了以下攻击文件。
- 运行检验程序,成功攻击
温馨提示
自己找找getbuf的传入参数等是什么
过程调用的栈的状态自己看看
感谢南大教学ppt, 23333