实验4缓冲区溢出攻击实验.docx

上传人:b****8 文档编号:9691148 上传时间:2023-05-20 格式:DOCX 页数:9 大小:737.48KB
下载 相关 举报
实验4缓冲区溢出攻击实验.docx_第1页
第1页 / 共9页
实验4缓冲区溢出攻击实验.docx_第2页
第2页 / 共9页
实验4缓冲区溢出攻击实验.docx_第3页
第3页 / 共9页
实验4缓冲区溢出攻击实验.docx_第4页
第4页 / 共9页
实验4缓冲区溢出攻击实验.docx_第5页
第5页 / 共9页
实验4缓冲区溢出攻击实验.docx_第6页
第6页 / 共9页
实验4缓冲区溢出攻击实验.docx_第7页
第7页 / 共9页
实验4缓冲区溢出攻击实验.docx_第8页
第8页 / 共9页
实验4缓冲区溢出攻击实验.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验4缓冲区溢出攻击实验.docx

《实验4缓冲区溢出攻击实验.docx》由会员分享,可在线阅读,更多相关《实验4缓冲区溢出攻击实验.docx(9页珍藏版)》请在冰点文库上搜索。

实验4缓冲区溢出攻击实验.docx

实验4缓冲区溢出攻击实验

深圳大学实验报告

 

课程名称:

计算机系统

(2)

实验项目名称:

缓冲区溢出攻击实验

学院:

计算机与软件学院

专业:

指导教师:

罗秋明

报告人:

学号:

班级:

实验时间:

2017年5月12日

实验报告提交时间:

2017年5月31日

 

教务处制

一、实验目标:

1.理解程序函数调用中参数传递机制;

2.掌握缓冲区溢出攻击方法;

3.进一步熟练掌握GDB调试工具和objdump反汇编工具。

二、实验环境:

1.计算机(IntelCPU)

2.Linux32位操作系统(Ubuntu16.04)

3.GDB调试工具

4.objdump反汇编工具

三、实验内容

本实验设计为一个黑客利用缓冲区溢出技术进行攻击的游戏。

我们仅给黑客(同学)提供一个二进制可执行文件bufbomb和部分函数的C代码,不提供每个关卡的源代码。

程序运行中有3个关卡,每个关卡需要用户输入正确的缓冲区内容,否则无法通过管卡!

要求同学查看各关卡的要求,运用GDB调试工具和objdump反汇编工具,通过分析汇编代码和相应的栈帧结构,通过缓冲区溢出办法在执行了getbuf()函数返回时作攻击,使之返回到各关卡要求的指定函数中。

第一关只需要返回到指定函数,第二关不仅返回到指定函数还需要为该指定函数准备好参数,最后一关要求在返回到指定函数之前执行一段汇编代码完成全局变量的修改。

实验代码bufbomb和相关工具(sendstring/makecookie)的更详细内容请参考“实验四缓冲区溢出攻击实验.pptx”。

本实验要求解决关卡1、2、3,给出实验思路,通过截图把实验过程和结果写在实验报告上。

四、实验步骤和结果

首先是makecookie:

 

步骤1返回到smoke()

1.1解题思路

步骤1是要修改getbuf()的返回地址,在执行完getbuf()后不是返回到原来的调用者test(),而是跳到一个叫做smoke()的函数里。

只需构造一段字符串让Gets()全部拷贝到buf数组了,从而造成缓冲区溢出。

同时最重要的一点是:

将smoke()函数的初始地址也放到构造的字符串内,使其恰好覆盖到getbuf()的returnaddress位置。

1.2解题过程

首先要知道smoke()的初始地址,用objdump查看符号表

smoke的初始地址是0x08048eb0。

buf第一个元素的地址是-0x18,而returnaddress第一个字节的地址是0x04,两个位置的相差换算成十进制就是0x04-(-0x18)=4+24=28。

也就是说我们要构造28个字符,然后加上smoke()的地址就能准确覆盖到returnaddress了。

1.3最终结果截图

步骤2返回到fizz()并准备相应参数

2.1解题思路

通过objdump-t查看符号表中fizz()函数的初始地址。

拿到了地址0x08048e60,只要用它替换掉之前exploit.raw中smoke()的地址就能让getbuf()执行完毕后返回到fizz()中。

然后用makecookie生成我的用户名ylb。

以getbuf()调用Gets()为例,看一下调用者的代码和对应的栈。

2.2解题过程

先分析出从getbuf()函数结束后,到调用fizz()函数前栈的情况:

0x0c即将是fizz()栈区

0x08即将是fizz()栈区

0x04getbuf()的返回地址(即fizz()的地址)<-%esp

0x00getbuf()中%ebp的保存值

得知,在返回并调用fizz()前,栈指针指向0x04处(相对getbuf()中的%ebp为0x00),随后fizz()调用时,会把fizz()的%ebp值压入栈中,

8048e66:

8b4508mov0x8(%ebp),%eax

8048e69:

3b05d4a10408cmp0x804a1d4,%eax

再结合这两行代码得知,fizz()函数的传入参数是应该存放在0x8(%ebp)处的,栈的情况应变为:

0x0cfizz的传入参数

0x08fizz()的返回地址

0x04fizz()中%ebp的保存值<-%esp(因为压栈,getbuf()的返回地址被替换)

0x00getbuf()中%ebp的保存值

010*********这串字符串刚覆盖到0x08,即还需要覆盖4个字节,然后传入黑客cookie值.

./makecookieylb利用该命令获得个人黑客cookie值为0x239772d5

黑客cookie值依据小端法调整为963cdf30,cookie值前方还需覆盖4个字节,故得到完整字符串内容为:

010*********d57297230d

catexploit2.txt|./sendstring|./bufbomb–tylb

最后通过以上指令来把字符串内容构造并输入到bufbomb程序中。

2.3最终结果截图

步骤3返回到bang()且修改global_value

3.1解题思路

因为全局变量与代码不在一个段中,所以我们不能让缓冲区一直溢出到.bss段(因为global_value初始化为0,所以它会被放在.bss而非.data段以节省空间)覆盖global_value的值。

若修改了.bss和.text之间某些只读的段会引起操作系统的“警觉”而报错。

所以在进入bang()之前我们需要执行一小段我们自己的代码去修改global_value,这一段代码就叫做exploitcode。

3.2解题过程

a.bang()和global_value地址

得到bang()的入口地址0x08048e10,以及global_value的地址0x0804a1c4

利用gdb调试获得buf字符数组的首地址,即是注入代码的首地址。

gdbbufbomb;调试程序

disassgetbuf;查看getbuf的汇编代码

给getbuf()设置断点,程序把断点设置在0x8048ad6

run–tylb;运行程序

p$ebp-0x18;由lea-0x18(%ebp),%eax分析出buf地址为%ebp地址-0x18

得出buf地址,也即注入代码地址应为0xbfffb930

接下来编写注入代码(汇编代码):

.code32;让gcc以32位模式来编译

movl$0x333382e2,0x0804a1c4;令global_value=cookie值

pushl$0x08048e10;%esp->bang入口地址

ret;retbang()

gcc–cexploit_code.s//编译汇编文件为可重定位文件.s->.o

objdump–dexploit_code.o//查看可重定位文件的内容

最终获得注入代码的16进制机器码,为16字节。

在第1题中返回地址前有28个字节的空间,故在注入代码后面仍需补充12个字节的空间,为方便计数定为01~12,紧接着则是buf的地址,让getbuf()返回时跳转到注入代码的首地址,按照小端法,buf地址应为30b9ffff,故完整字符串为:

c705c4a10408e282333368108e0408c301020304050607080910111230b9ffbf0d

忽略空格(和下划线)后,得到exploit3.txt的内容为:

c705c4a10408e282333368108e0408c301020304050607080910111230b9ffbf0d

Linux内存地址有随机化机制,若随机化机制打开,那么每次运行程序,%ebp的地址可能是不一样的,即buf地址无法确定(注入代码开始地址无法确定),这样的话,注入代码将无法正确编写。

所以需要先关闭Linux内存地址随机化机制,才能完成实验。

可以通过设置kernel.randomize_va_space内核参数来设置内存地址随机化的行为。

#echo0>/proc/sys/kernel/randomize_va_space

3.3最终结果截图

将global_value的值设为0x333382e2

五、实验总结与体会

(1)在做第一题的时候,遇到了一个问题。

Error:

Unabletosendvalidationinformationtogradingserver.随后在网上查阅了相关的资料,明白了需要先安装sendmail。

执行的命令如下:

sudoapt-getinstallsendmail

sudoapt-getinstallsendmail-cf

随后问题得以解决。

(2)而第三题,遇到了一个问题。

Linux有内存地址随机化机制,因此在运行时,buf数组的首地址是不一样的,即注入代码首地址不能确定,此时,需要先关闭内存地址随机化机制,确定buf首地址后,编写注入代码,再来运行程序,才能成功。

 

指导教师批阅意见:

成绩评定:

指导教师签字:

罗秋明

2017年5月24日

备注:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2