缓冲区溢出技术.ppt

缓冲区溢出技术.ppt

ID:49380657

大小:620.50 KB

页数:45页

时间:2020-02-04

缓冲区溢出技术.ppt_第1页
缓冲区溢出技术.ppt_第2页
缓冲区溢出技术.ppt_第3页
缓冲区溢出技术.ppt_第4页
缓冲区溢出技术.ppt_第5页
资源描述:

《缓冲区溢出技术.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、缓冲区溢出技术堆栈从物理上讲,堆栈是就是一段连续分配的内存空间静态全局变量是位于数据段并且在程序开始运行的时候被加载动态的局部变量则分配在堆栈里面从操作上来讲,堆栈是一个先入后出的队列,其生长方向与内存的生长方向正好相反我们规定内存的生长方向为向上,则栈的生长方向为向下压栈的操作push=ESP-4出栈的操作是pop=ESP+4在一次函数调用中,堆栈中将被依次压入:参数,返回地址,EBP如果函数有局部变量,接下来,就在堆栈中开辟相应的空间以构造变量函数执行结束,这些局部变量的内容将被丢失。但是不被清除在函数返回的时候,弹出EBP,恢复堆栈到函数调用的地址

2、,弹出返回地址到EIP以继续执行程序在C语言程序中,参数的压栈顺序是反向的:比如func(a,b,c)。在参数入栈的时候,是先压c,再压b,最后压a在取参数的时候,由于栈的先入后出,先取栈顶的a,再取b,最后取c运行时的堆栈分配我们用gcc-S来获得汇编语言输出,可以看到main函数的开头部分对应如下语句:pushl%ebpmovl%esp,%ebpsubl$8,%esp首先把EBP保存下来,然后EBP等于现在的ESP,这样EBP就可以用来访问本函数的局部变量之后ESP减8,就是堆栈向上增长8个字节,用来存放name[]数组。现在堆栈的布局如下:之后ES

3、P减8,就是堆栈向上增长8个字节,用来存放name[]数组。现在堆栈的布局如下:由于我们输入的name字符串太长,name数组容纳不下,只好向内存顶部继续写‘A’由于堆栈的生长方向与内存的生长方向相反,这些‘A’覆盖了堆栈的老的元素EBP,ret都已经被‘A’覆盖了在main返回的时候,就会把‘AAAA’的ASCII码:0x41414141作为返回地址,CPU会试图执行0x41414141处的指令,结果出现错误,这就是一次堆栈溢出Shellcode的编写Shellcode.c#includevoidmain(){char*name[2]

4、;name[0]="/bin/sh";name[1]=NULL;execve(name[0],name,NULL);}execve()execve函数将执行一个程序程序的名字地址作为第一个参数一个内容为该程序的argv[i](argv[n-1]=0)的指针数组作为第二个参数(char*)0作为第三个参数execve的汇编代码$gcc-oshellcode-staticshellcode.c$gdbshellcode(gdb)disassemble__execveDumpofassemblercodeforfunction__execve:如何精简?经过以

5、上的分析,可以得到如下的精简指令算法:movl$execve的系统调用号,%eaxmovl"bin/sh"的地址,%ebxmovlname数组的地址,%ecxmovlname[n-1]的地址,%edxint$0x80;执行系统调用(execve)问题当execve执行成功后,程序shellcode就会退出,/bin/sh将作为子进程继续执行如果execve执行失败,(比如没有/bin/sh这个文件),CPU就会继续执行后续的指令,结果不知道跑到哪里去了所以必须再执行一个exit()系统调用,结束shellcode.c的执行exit(0)汇编代码exi

6、t(0)的汇编代码精简movl$0x1,%eax;1号系统调用movl0,%ebx;ebx为exit的参数0int$0x80;引发系统调用execve+exitmovl$execve的系统调用号,%eaxmovl“bin/sh”的地址,%ebxmovlname数组的地址,%ecxmovlname[n-1]的地址,%edxint$0x80;执行系统调用(execve)movl$0x1,%eax;1号系统调用movl0,%ebx;ebx为exit的参数0int$0x80;执行系统调用(exit)万事具备,还欠什么?字符串“/bin/sh”name数组ex

7、ecve+exit问题每一次程序都是动态加载,字符串和name数组的地址都不是固定的在shellcode中如何知道它们的地址呢?jmp+call在large_string中填入buffer的地址把shell代码放到large_string的前面部分将large_string拷贝到buffer中造成溢出,使返回地址变为buffer,而buffer的内容为shell代码。这样当程序试从strcpy()中返回时,就会转而执行shell如何利用别人的漏洞利用别人的程序的堆栈溢出获得rootshell以一个有strcpy堆栈溢出漏洞的程序,利用前面说过的方法来得到

8、shell同样必须完成两件事把自己的shellcode提供给对方,让对方可以访问

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。