计算机系统基础-缓冲区溢出攻击

  • 实验目的

这项作业将帮助你发展对 IA-32 调用约定和堆栈组织的详细理解。它包括对实验室目录中的可执

行文件 bufbomb 进行一系列缓冲区溢出攻击

  • 实验要求

本实验的各个阶段需要每个学生提供稍微不同的解决方案。正确的解决方案将基于您的用户 id。

cookie 是一个由八个十六进制数字组成的字符串,它(很有可能)对您的用户 id 是唯一的。您可以使用

makecookie 程序生成您的 cookie,并给出您的用户 id 作为参数。例如:

unix >。/makecookie bovik

0x1005b2b7

在五次缓冲区攻击中的四次中,你的目标是让你的 cookie 出现在通常不会出现的地方。

  • 实验内容(所修改函数代码,功能以及重要代码的解释):

先解压压缩包,再根据自己对应的学号生成对应的cookie值。

 

Level 0:candle

当test函数调用完getbuf函数后,会向下执行,我们要让它跳转到smoke函数,那我们就要修改getbuf函数的返回地址,首先我们反汇编getbuf函数和smoke函数。

 

可以看出lea把buf的指针地址(-0x32(%ebp))传给了Gets()函数,也就是buf距离返回地址有0x32+4(%ebp的字节数)=54个字节的距离,所以我们只要在buf开始位置填入54个字节,并在返回地址中填入smoke的地址就行了,smoke的地址为0x08048ba1.

 

Level 1:sparker

要让getbuf函数的返回地址指向fizz函数,同时要让fizz的参数设置为对应的cookie值。

先反汇编fizz函数:

 

找到fizz函数的首地址:0x08048bce

fizz函数的参数在fizz函数首地址和cookie值之间:

 

 

Level 2:Firecracker

Getbuf函数调用后,不执行test函数,而要执行bang函数,同时我们要修改global_value的值为cookie值,但是global_value是一个全局变量,没有出现在函数里,所以我们要利用函数调用来赋值。

首先反汇编bang函数:

 

根据mov 0x804d140,%eax;mov %eax,%edx;mov 0x804d138,%eax可知value的值储存在0x804d140中,cookie的值储存在0x804d138中,所以写出他们的汇编代码:

 

然后再将汇编代码转换成二进制文件:

 

由于bang函数的首地址为0x08048c1f,所以我们要将getbuf的返回地址改为buf的首地址运行,上一个栈的4字节改成bang函数的地址,这样的话,当在getbuf函数调用完ret返回时程序会跳转到buf上面的恶意函数指令,再跳转到bang函数的地址,所以我们要得到buf的地址:

 

所以buf的地址为0x556833be,再构造文件:

 

Level 3:Dynamite

这个实验要求getbuf调用完之后返回到test中,且不能破坏test函数的堆栈状态,同时返回值为cookie值。

先反汇编test函数:

 

从汇编代码中可以看出getbuf函数返回地址为0x08048c8d,写出它的汇编代码:

 

然后转为二进制文件:

 

由于覆盖getbuf返回地址时会覆盖保存的ebp的值,所以ebp应该取寄存器指向的值,为0x55683410:

 

构造文件:

 

Level 5:Nitroglycerin

这关需要加上-n运行bufbomb,进入testn和getbufn函数。

这关会要求提供输入5次字符串,每一次都要求getbufn的返回值为自己的cookie值,其他要求与上一个实验相同。

反汇编getbufn函数与testn函数:

 

 

可以看出再getbufn函数中ebp比esp中的内容大0x2c2,调用完getbufn函数后返回到0x08048d07,所以写出恶意代码:

 

先根据mov %esp,%ebp和sub $0x18,%esp恢复ebp中的内容,再返回cookie值,最后返回地址指向testn中的getbufn调用后的一条指令,再返回testn继续执行。

 

找到buf的首地址:

 

得到最大的地址为0x55683198,将它作为跳转地址,有效机器代码至于跳转地址之前,并将它所有的字符作为nop指令,此时五个buf地址的写入都能满足跳转到0x55683198后顺利到达有效机器代码。

所以构造文本:

 

因为0x2c2为706,所以buf首地址距离ebp寄存器为706字节,填充超过706就溢出;前691个90为机器空指令操作,紧接着15个字节恢复栈和赋值cookie指令,再4字节填充,最后4字节为buf最高跳转地址。

 

四、实验总结

这个实验有个地方有陷阱:

等级五那里恢复ebp寄存器的内容,刚开始我用的是0x32,但一直报错,仔细看了testn的代码后,发现只进行了0x18(%esp),所以构造恶意代码时,进行lea 0x18(%esp),%ebp操作。

  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值